21 Mayıs 2012 Pazartesi

C# ile XML Kullanımı

Merhaba değerli Webkolog.net takipçileri, bugünkü yazımızda C# .NET Framework 4 ile XML dosyalarını nasıl okuyup yazabileceğimizi, XML verilerini nasıl işleyebileceğimizi ve farklı XML işleme yöntemlerini yakından inceleyeceğiz. XML (eXtensible Markup Language), veri depolama ve transferi için yaygın olarak kullanılan bir formattır. C# .NET Framework, XML verileriyle çalışmak için zengin araçlar sunar.

XML Nedir?

XML, yapılandırılmış veriyi temsil etmek için kullanılan bir metin biçimidir. XML, etiketler (tags) kullanarak veriyi hiyerarşik bir yapıda saklar. XML, insanlar ve makineler tarafından kolayca okunabilir ve işlenebilir.

C# ile XML İşleme Yöntemleri

C# .NET Framework, XML verileriyle çalışmak için çeşitli sınıflar ve yöntemler sunar. Başlıca XML işleme yöntemleri şunlardır:

  • XmlReader ve XmlWriter: XML verilerini okumak ve yazmak için kullanılan hızlı ve bellek açısından verimli yöntemlerdir.
  • XmlDocument: XML verilerini bir ağaç yapısında temsil eden ve üzerinde gezinme, düzenleme ve sorgulama gibi işlemleri yapmamızı sağlayan bir sınıftır.
  • LINQ to XML: LINQ (Language Integrated Query) kullanarak XML verilerini sorgulamak ve işlemek için kullanılan modern ve kullanımı kolay bir yöntemdir.

XML Verilerini SQL Veritabanına Aktarma ve SQL Veritabanından XML'e Aktarma

XML verilerini bir SQL Server veritabanına aktarmak veya SQL Server veritabanından XML'e aktarmak için aşağıdaki adımları izleyebiliriz:

XML'den SQL'e Aktarma:

using System.Data;
using System.Data.SqlClient;
// XML dosyasından DataSet'e veri okuma
DataSet ds = new DataSet();
ds.ReadXml(Application.StartupPath + "\\SqlDenGelen.xml");
// SQL Server bağlantısı oluşturma
SqlConnection cnn = new SqlConnection("server=.; Database=KuzeyRuzgari; trusted_connection=true");
// Veri adaptörü ve komut oluşturucu oluşturma
SqlDataAdapter adp = new SqlDataAdapter("SELECT * FROM Urunler", cnn);
SqlCommandBuilder sc = new SqlCommandBuilder(adp);
// DataSet'teki verileri veritabanına aktarma
adp.Update(ds.Tables[0]);
 

SQL'den XML'e Aktarma:

using System.Data;
using System.Data.SqlClient;
// SQL Server bağlantısı oluşturma
SqlConnection cnn = new SqlConnection("server=.; Database=KuzeyRuzgari; trusted_connection=true");
// Veri adaptörü oluşturma
SqlDataAdapter adp = new SqlDataAdapter("SELECT * FROM Urunler", cnn);
// DataSet ve DataTable oluşturma
DataSet ds = new DataSet("Urunler");
DataTable dt = new DataTable("Urun");
// Verileri DataTable'a doldurma
adp.Fill(dt);
ds.Tables.Add(dt);
// DataSet'teki verileri XML dosyasına yazma
ds.Tables[0].WriteXml(Application.StartupPath + "\\SqlDenGelen.xml");
 

LINQ to XML Kullanımı

LINQ to XML, XML verilerini sorgulamak ve işlemek için LINQ sorgularını kullanmamızı sağlar. Bu yöntem, XML verileriyle çalışmayı daha kolay ve sezgisel hale getirir.

Örnek:

using System.Linq;
using System.Xml.Linq;
// Satislar sınıfı (örnek veri sınıfı)
class Satislar
{
    public DateTime Tarih { get; set; }
    public List Urunler { get; set; }
}
class Urun
{
    public int Miktar { get; set; }
}
// Örnek satış verileri oluşturma
List satislar = new List()
{
    new Satislar { Tarih = DateTime.Now, Urunler = new List { new Urun { Miktar = 10 }, new Urun { Miktar = 20 } } },
    new Satislar { Tarih = DateTime.Now.AddDays(-1), Urunler = new List { new Urun { Miktar = 5 }, new Urun { Miktar = 15 } } }
};
// LINQ to XML sorgusu ile XML oluşturma
var satisXML = new XElement("Satislar",
    from s in satislar
    select new XElement("Satis",
        new XAttribute("SatisTarih", s.Tarih.ToString()),
        new XAttribute("ToplamMiktar", s.Urunler.Sum(i => i.Miktar))
    )
);
// XML'i string olarak elde etme
string xmlString = satisXML.ToString();
Console.WriteLine(xmlString);
 

XmlReader Kullanımı (XML Okuma)

XmlReader sınıfı, XML verilerini hızlı ve bellek açısından verimli bir şekilde okumamızı sağlar. XmlReader, sadece ileri yönlü okuma (forward-only) yapar, yani sadece ileriye doğru hareket edebilir ve okunan veriyi geri alamaz.

Örnek:

using System.Xml;
// XML dosyasını okumak için XmlTextReader oluşturma
XmlTextReader rdr = new XmlTextReader("C:/dosya.xml");
// XML dosyasını okuma
while (rdr.Read())
{
    if (rdr.NodeType == XmlNodeType.Element)
    {
        // Element adını ve değerini yazdırma
        Console.WriteLine("Element: " + rdr.Name);
        Console.WriteLine("Değer: " + rdr.Value);
        Console.WriteLine("Derinlik: " + rdr.Depth);
// Elementin öznitelikleri varsa, ilk özniteliği yazdırma
        if (rdr.HasAttributes)
        {
            Console.WriteLine("İlk Öznitelik: " + rdr.GetAttribute(0));
        }
    }
}
 

XmlNodeType Değerleri:

XmlReader sınıfının NodeType özelliği, o anki düğümün türünü belirtir. Başlıca XmlNodeType değerleri şunlardır:

  • Attribute: Öznitelik
  • CDATA: CDATA bölümü
  • Comment: Yorum
  • Document: Belge
  • DocumentType: Belge türü tanımı
  • Element: Element
  • EndElement: Elementin bitiş etiketi
  • EntityReference: Varlık referansı
  • None: Düğüm yok
  • ProcessingInstruction: İşleme yönergesi
  • Text: Metin
  • XmlDeclaration: XML bildirimi 

XmlValidatingReader Kullanımı (Doğrulamalı Okuma)

XmlValidatingReader sınıfı, XML verilerini okurken belirli bir şemaya (örneğin, DTD veya XSD) göre doğrulamak için kullanılır.

Örnek:

using System.Xml;
using System.Xml.Schema;
// XmlTextReader ile XML dosyasını okuma
XmlTextReader rdr = new XmlTextReader("C:/dosya.xml");
// XmlValidatingReader oluşturma ve doğrulama türünü ayarlama
XmlValidatingReader dogrula = new XmlValidatingReader(rdr);
dogrula.ValidationType = ValidationType.DTD; // DTD'ye göre doğrulama
// Doğrulama olayını yakalama
dogrula.ValidationEventHandler += new ValidationEventHandler(HataYakala);
// XML dosyasını okuma ve doğrulama
while (dogrula.Read())
{
    // Kodlar
}
// Hata yakalama metodu
void HataYakala(object sender, ValidationEventArgs e)
{
    Console.WriteLine("Doğrulama Hatası: " + e.Message);
}
 

ValidationType Değerleri:

  • Auto: Otomatik olarak şema türünü algıla
  • DTD: DTD'ye göre doğrulama
  • None: Doğrulama yapma
  • Schemas: XSD şemasına göre doğrulama
  • XDR: XDR şemasına göre doğrulama (obsolete)

XmlTextWriter Kullanımı (XML Dosyası Oluşturma)

XmlTextWriter sınıfı, XML dosyaları oluşturmak için kullanılır. Bu sınıf, XML verilerini bir dosyaya yazmamızı sağlar.

Örnek:

using System.Xml;
using System.Text;
// XML dosyası oluşturmak için XmlTextWriter oluşturma
XmlTextWriter yaz = new XmlTextWriter("C:\\dosya.xml", Encoding.UTF8);
yaz.Formatting = Formatting.Indented; // Girintili yaz
yaz.Indentation = 5; // Girinti karakter sayısı
// XML belgesini yazma
yaz.WriteStartDocument();
yaz.WriteStartElement("insan");
yaz.WriteAttributeString("tc", "12345678901");
yaz.WriteElementString("isim", "Ali");
yaz.WriteFullEndElement();
yaz.WriteEndDocument();
// Dosyayı kapatma
yaz.Close();
 

XmlTextWriter Özellikleri:

  • Formatting: Girinti tipini belirtir (None veya Indented).
  • Indentation: Girinti için kullanılacak karakter sayısını belirtir.
  • IndentChar: Girinti için kullanılacak karakteri belirtir (varsayılan: boşluk).
  • Namespaces: Namespace kullanımını belirtir.
  • QuoteChar: Öznitelik değerlerini çevreleyen tırnak karakterini belirtir.

XmlTextWriter Metotları:

  • .WriteStartDocument(): XML başlangıç satırını yaz.
  • .WriteEndDocument(): XML belgesini bitir.
  • .WriteStartElement(): Bir elementin başlangıç etiketini yaz.
  • .WriteEndElement(): Bir elementin bitiş etiketini yaz.
  • .WriteStartAttribute(): Bir özniteliğin başlangıcını yaz.
  • .WriteEndAttribute(): Bir özniteliğin bitişini yaz.
  • .WriteElementString(): Bir elementin başlangıç ve bitiş etiketlerini ve içindeki metni yaz.
  • .WriteAttributeString(): Bir özniteliğin adını ve değerini yaz.
  • .WriteDocType(): DOCTYPE bildirimini yaz.
  • .WriteComment(): Yorum yaz.
  • .WriteFullEndElement(): Boş bir elementin bitiş etiketini yaz (örneğin, <element/>). 

XmlDocument Kullanımı (XML Okuma ve Yazma)

XmlDocument sınıfı, XML verilerini bir ağaç yapısında temsil eder ve hem okuma hem de yazma işlemlerini yapmamızı sağlar. Bu sınıf, XML verilerini düzenlemek, silmek ve üzerinde gezinmek için de kullanılabilir.

Örnek 1: Dosyadan Okuma

using System.Xml;
// XmlDocument nesnesi oluşturma
XmlDocument doc = new XmlDocument();
// XML dosyasını yükleme
doc.Load("c:\\dosya.xml");
 

Örnek 2: Stringden Okuma

using System.Xml;
// XmlDocument nesnesi oluşturma
XmlDocument doc = new XmlDocument();
string veriXML = "...."; // XML verisi içeren string
doc.LoadXml(veriXML);
 

Örnek 3: Dosyaya Yazma

using System.Xml;
// XmlDocument nesnesi oluşturma ve XML dosyasını yükleme
XmlDocument doc = new XmlDocument();
doc.Load("dosya.xml");
// Yeni bir insan elementi oluşturma
XmlElement root = doc.DocumentElement; // Kök elementi al
XmlElement insan = doc.CreateElement("insan");
XmlElement isim = doc.CreateElement("isim");
isim.InnerText = "Ali"; // Elementin iç metnini ayarlama
insan.AppendChild(isim); // isim elementini insan elementine ekleme
root.AppendChild(insan); // insan elementini kök elemente ekleme
// Değişiklikleri yeni bir dosyaya kaydetme
doc.Save("yeni_dosya.xml");
 

Örnek 4: Değiştirme

using System.Xml;
// XmlDocument nesnesi oluşturma ve XML dosyasını yükleme
XmlDocument doc = new XmlDocument();
doc.Load("dosya.xml");
// Değiştirilecek düğümü seçme
XmlNode root = doc.DocumentElement;
XmlNode node = root.ChildNodes[0].ChildNodes[0]; // Örnek bir düğüm seçimi
// Düğümün iç metnini değiştirme
node.InnerText = "Burak";
// Değişiklikleri dosyaya kaydetme
doc.Save("dosya.xml");
 

Örnek 5: Silme

using System.Xml;
// XmlDocument nesnesi oluşturma ve XML dosyasını yükleme
XmlDocument doc = new XmlDocument();
doc.Load("dosya.xml");
// Silinecek düğümü seçme
XmlElement insan = doc.DocumentElement;
XmlElement isim = (XmlElement)insan.SelectSingleNode("isim");
// Bir düğümü silme
insan.RemoveChild(isim);
// Tüm alt düğümleri silme
// insan.RemoveAll();
// Değişiklikleri dosyaya kaydetme
doc.Save("dosya.xml");
 

XmlElement Özellikleri:

  • Name: Elementin adını alır.
  • InnerText: Elementin içindeki metni alır (sadece metin düğümleri).
  • InnerXml: Elementin içindeki XML'i alır.
  • OuterXml: Elementin kendisi de dahil olmak üzere, elementin içindeki XML'i alır.
  • ChildNodes: Elementin alt düğümlerinin bir listesini (XmlNodeList) alır.
  • FirstChild: Elementin ilk alt düğümünü alır (XmlElement döndürür).
  • LastChild: Elementin son alt düğümünü alır (XmlElement döndürür).
  • NextSibling: Elementin bir sonraki kardeş düğümünü alır (XmlElement döndürür).
  • PreviousSibling: Elementin bir önceki kardeş düğümünü alır (XmlElement döndürür). 

XmlNodeList Özellikleri:

  • Count: Listedeki düğüm sayısını alır.
  • Item(int index) veya [int index]: Belirtilen dizindeki düğümü alır.

XmlDocument, XmlNode, XmlReaderSettings, XmlWriterSettings, XmlWriter Sınıfları

Aşağıdaki tabloda, sık kullanılan XML sınıfları ve metotları özetlenmiştir:

XmlDocument

  • .Load(string yol): XML dosyasını yükler.
  • .Save(string yol): XML dosyasını kaydeder.
  • .AppendChild(XmlNode node): Bir düğümü sona ekler.
  • .ChildNodes[int index]: Belirtilen dizindeki alt düğümü alır.
  • .ChildNodes[int index].InnerText: Bir etiketin içindeki değeri alır.
  • .SelectNodes(string xpath): Belirtilen XPath ifadesine uyan düğümleri seçer.
  • .SelectSingleNode(string xpath): Belirtilen XPath ifadesine uyan ilk düğümü seçer.
  • .DocumentElement: XML belgesinin kök elementini alır.
  • .DocumentElement.InsertAfter(XmlNode yeniNode, XmlNode referansNode): Yeni bir düğümü belirtilen düğümün sonrasına ekler.
  • .DocumentElement.InsertBefore(XmlNode yeniNode, XmlNode referansNode): Yeni bir düğümü belirtilen düğümün öncesine ekler.
  • .DocumentElement.RemoveChild(XmlNode node): Bir alt düğümü siler.
  • .CreateElement(): Yeni bir element oluşturur.
  • .CreateAttribute(): Yeni bir attribute oluşturur.
  • .CreateTextNode(): Yeni bir text node oluşturur.

XmlNode

  • .Attributes["attr_adi"].Value: Bir özniteliğin değerini alır.
  • .ChildNodes[int index]: Belirtilen dizindeki alt düğümü alır.
  • .ChildNodes[int index].InnerText: Bir etiketin içindeki değeri alır.

XmlReaderSettings

  • .Schemas.Add(string namespaceURI, string schemaUrl): Bir şema ekler.
  • .ValidationType: Doğrulama türünü belirtir.
  • .ValidationEventHandler: Doğrulama hatalarını işlemek için bir olay işleyicisi belirtir.

XmlWriterSettings

  • .Encoding: Kullanılacak kodlamayı belirtir.
  • .Indent: Girintileme yapılıp yapılmayacağını belirtir (true veya false).

XmlWriter

  • .WriteStartDocument(): XML belgesinin başlangıcını yazar.
  • .WriteStartElement(string ad): Bir elementin başlangıç etiketini yazar.
  • .WriteAttributeString(string ad, string deger): Bir öznitelik yazar.
  • .WriteEndElement(): Bir elementin bitiş etiketini yazar.
  • .WriteEndDocument(): XML belgesinin bitişini yazar.
  • .Close(): XmlWriter'ı kapatır ve kaynakları serbest bırakır.

XPath ile Sorgulama

XPath, XML belgelerinde düğümleri seçmek için kullanılan bir sorgulama dilidir. XmlDocument sınıfının SelectNodes() ve SelectSingleNode() metotları ile XPath ifadeleri kullanarak XML verilerini sorgulayabiliriz.

Örnek XPath İfadesi:

"root/node/element[fiyat >= 5 and fiyat <= 10]"

Bu ifade, root elementinin altındaki node elementinin altındaki element elementlerinden fiyat özniteliği 5 ile 10 arasında olanları seçer.

Örnek: XML Dosyasından Veri Okuma

using System.Xml;
using System.IO;
using System.Windows.Forms;
// XML dosyasından veri okuma ve MessageBox'ta gösterme
XmlDataDocument xmldoc = new XmlDataDocument();
XmlNodeList xmlnode;
int i = 0;
string str = null;
FileStream fs = new FileStream("product.xml", FileMode.Open, FileAccess.Read);
xmldoc.Load(fs);
xmlnode = xmldoc.GetElementsByTagName("Product");
for (i = 0; i <= xmlnode.Count - 1; i++)
{
    str = xmlnode[i].ChildNodes.Item(0).InnerText.Trim() + " " +
          xmlnode[i].ChildNodes.Item(1).InnerText.Trim() + " " +
          xmlnode[i].ChildNodes.Item(2).InnerText.Trim();
    MessageBox.Show(str);
}

Not: XML dosyasının Visual Studio'da "Copy to Output Directory" özelliği "Copy Always" olarak ayarlanmalıdır.

Bu makale, C# .NET Framework 4 ile XML kullanımının temel prensiplerini ve yöntemlerini ele almaktadır. XML, veri alışverişi ve depolama için önemli bir araçtır ve C# .NET Framework, XML verileriyle çalışmak için zengin özellikler sunar. Umarım bu bilgiler, C# projelerinizde XML'i etkili bir şekilde kullanmanıza yardımcı olur. Bir sonraki yazımızda, C# dilinin diğer önemli yapı taşlarını keşfetmeye devam edeceğiz.

Webkolog'u takipte kalın!

Hepinize bol kodlu günler dilerim!


0 yorum:

Yorum Gönder