C# XML Okuma ve Yazma İşlemleri

Paylaş

C# ile XML oluşturma, okuma ve yazma işlemleri sırasında kullanılan ve System.Xml alanında yer alan XmlWriter, XmlReader, XmlDocument ve Xml Serialization ile ilgili bilgiler yer alıyor.

XML hakkında detaylı bilgi almak için XML Nedir? yazıma bakabilirsiniz.

C# XML işlemleri

.NET içerisinde birçok işlem XML dosyaları ile yapılır.

Visual Studio ile bir proje oluşturulurken Visual Studio tarafından oluşturulan MSBuild ayarları, uygulama ayarları XML dosyalarında saklanır.

Ayrıca ADO.NET ile veritabanı işlemlerinde, platformlar arası veri alışverişinde JSON ile birlikte giderek azalsa da kullanılır.

.NET içerisinde XML işlemleri sıklıkla kullanıldığından dolayı System.Xml alanında XML okuma, yazma, doğrulama gibi işlemler için sınıf ve arayüzler yer alır.

XmlWriter ve XmlReader

.NET System.Xml alanında yer alan soyut XmlWriter ve XmlReader sınıfları adlarından da anlaşılacağı üzere XML okuma ve yazma işlemleri için kullanılır.

Sınıflar soyut olduklarından dolayı Create metodu ile oluşturulur.

Metot parametre olarak dosya yolu, akım ve XML ayarlarını (XmlWriterSettings) parametre alan aşırı yüklenmiş kullanıma sahiptir.

string xmlDosyasi = @"dosya.xml";
XmlWriter xmlYazici = XmlWriter.Create(xmlDosyasi);

XmlWriter sınıfı ile XML yazma işlemleri Write ile başlayan metotlar ile yapılır.

string xmlDosyasi = @"dosya.xml";
XmlWriter xmlYazici = XmlWriter.Create(xmlDosyasi);

xmlYazici.WriteStartDocument();

xmlYazici.WriteStartElement("etiket");
xmlYazici.WriteString("Etiket içeriği");
xmlYazici.WriteEndElement();

xmlYazici.WriteEndDocument();
xmlYazici.Close();

XmlReader sınıfı ile XML okuma işlemi XmlWriter sınıfına göre daha zordur.

Çünkü okuma işlemi tek yönlü yapılır ve okuma işlemini kontrol edilmesi gerekir.

string xmlDosyasi = @"dosya.xml";
// XmlTextReader XmlOkuyucu = new XmlTextReader(xmlDosyasi);  // önerilmez
XmlReader XmlOkuyucu = XmlReader.Create(xmlDosyasi);

while (XmlOkuyucu.Read()) {
    if (XmlOkuyucu.NodeType == XmlNodeType.Element)
    {
        Console.WriteLine("Etiket: {0} İçerik: {1}", XmlOkuyucu.Name, XmlOkuyucu.ReadElementContentAsString());
    }
}

XmlOkuyucu.Close();

Örnekte görüldüğü üzere okunan XML dosyasının içeriği Read metodu ile dolaşıp NodeType değeri ile kontrol edilerek alınmıştır.

XML okuma ve yazma işlemleri için ayrıca XmlWriter ve XmlReader sınıflarında türeyen XmlTextWriter ve XmlTextReader sınıflarıda yer almaktadır ancak kullanımı Microsoft tarafından önerilmemektedir. (Zaten Visual Studio ile yazım sırasında çıkmayacaktır.)

XmlDocument

XML okuma ve yazma işlemlerini daha kolay bir şekilde yapmak için XmlDocument sınıfı ve yardımcı sınıflar kullanılabilir

XmlDocument sınıfının XmlWriter ve XmlReader sınıflarından farkı XmlDocument XML dosyasını belleğe bilgisayar bilimlerinde yer alan ağaç veri yapısı biçimde yerleştirerek veri erişime imkan vermesidir.

Veriler belleğe yüklediğinden büyük boyutlu XML dosyalarında çalışılması tavsiye edilmemektedir.

Ancak esnek yapısı sayesinde okuma ve yazma işlemleri çok kolay bir şekilde yapılır.

Okuma işlemi için Load metodu kullanılır.

string xmlDosyasi = @"dosya.xml";
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(xmlDosyasi);

foreach (XmlNode XmlNode in xmlDocument.DocumentElement) {
    Console.WriteLine("Etiket: {0} İçerik: {1}", XmlNode.ParentNode.Name, XmlNode.Value);
}

Okuma işleminde döngüler kullanılabileceği gibi Xpath sorgusu da kullanılabilir.

Xpath sorgusu sonucunda tek bir elemana ulaşmak için SelectSingleNode metodu kullanılır.

Metot sorgu ile eşleşen kayıt bulduğunda XmlNode türünden değer döndürecektir.

string xmlDosyasi = @"dosya.xml";
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(xmlDosyasi);

XmlNode bulunanNode = xmlDocument.SelectSingleNode("xpath-sorgusu");

Console.WriteLine(bulunanNode.Name);
Console.WriteLine(bulunanNode.Value);

Xpath sorgusu sonucunda birden fazla elemana ulaşmak için SelectNodes metodu kullanılır.

Metot arama terimi ile eşleşen kayıt bulduğunda XmlNodeList türünden değer döndürecektir.

string xmlDosyasi = @"dosya.xml";
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(xmlDosyasi);

XmlNodeList bulunanNodelar = xmlDocument.SelectNodes("xpath-sorgusu");

foreach (XmlNode xmlNode in bulunanNodelar) {
    Console.WriteLine("Etiket: {0} İçerik: {1}", xmlNode.ParentNode.Name, xmlNode.Value);
}

XPath hakkında detaylı bilgi almak için XPath Nedir? yazıma bakabilirsiniz.

XmlDocument sınıfı ayrıca XmlAttribute, XmlDeclaration, XmlComment gibi sınıflarla çalışabilecek şekilde geniş bir kullanımı vardır.

XmlDocument sınıfı ile belleğe yüklenen XML dosyası Save metodu ile dosyaya yazılabilir.

string xmlDosyasi = @"dosya.xml";
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(xmlDosyasi);

// XML işlemleri

xmlDocument.Save(xmlDosyasi)

XmlDocument ile XML dosyası oluşturma örneği aşağıda yer almaktadır.

string xmlDosyasi = @"dosya.xml";
XmlDocument xmlDocument = new XmlDocument();

XmlDeclaration xmlDeclaration = xmlDocument.CreateXmlDeclaration("1.0", "utf-8", null);
XmlElement xmlElement = xmlDocument.DocumentElement;
xmlDocument.InsertBefore(xmlDeclaration, xmlElement);

XmlElement bodyElement = xmlDocument.CreateElement("etiket");
bodyElement.InnerText = "Etiket içeriği";
xmlDocument.AppendChild(bodyElement);

xmlDocument.Save(xmlDosyasi);

XML serialization

C# ile XML işlemlerini kolay bir şekilde yapmanın diğer bir yolu ise XML serileştirme yöntemini kullanmaktır.

Serialization temel olarak sınıfa eklenen nitelikler (Attributes) sayesinde olur.

Örnek sınıf aşağıda yer almaktadır.

[Serializable]
class Sinif {
    public string ADI { get; set; }
    public string SOYADI { get; set; }
}

Sınıfa serileştirme özelliği kattıktan sonra System.Xml.Serialization alanıda yer alan XmlSerializer sınıfı ile veriler XML formatında kaydedilir.

string xmlDosyasi = @"dosya.xml";
Sinif s1 = new Sinif
{
    ADI = "Yusuf",
    SOYADI = "Sezer"
};

FileStream fileStream = File.OpenWrite(xmlDosyasi);
XmlSerializer xmlSerializer = new XmlSerializer(s1.GetType());
xmlSerializer.Serialize(fileStream, s1);
fileStream.Close();

XML dosyasının kök etiketini değiştirmek için Serialize metodunun ikinci parametresine XmlRootAttribute sınıfı gönderilir.

Serileştirme ile oluşturulan XML dosyası yine XmlSerializer sınıfının Deserialize metodu ile alınır.

Sinif s1 = null;

FileStream fileStream = File.OpenRead(xmlDosyasi);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Sinif));
s1 = (Sinif)xmlSerializer.Deserialize(fileStream);

Serileştirme işlemi diğer işlemlere göre daha kolay olsa da yeni bir sınıfı oluşturmak ve verilerin büyük küçük harf değişikliğine göre uyuşmaması beklenmedik sonuçlar çıkarabilir.

C#, XmlWriter, XmlReader, XmlDocument ve Xml serialization kullanarak yaptığım örneğe buradan ulaşabilirsiniz.

C# Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.


Bunlarda ilgini çekebilir


LinkedIn grubuna buradan katılın.