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
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