8. XML – C# bağlantısı: xmlReader sınıfı

 XML – C# bağlantısı: xmlReader sınıfı

1. 
İlk olarak bir string değişken oluşturulup içerisine okunmak istenen xml dosyasının path’i verilir.

string dosya = "C:/Users/LENOVO/documents/visual studio 2017/Projects/ConsoleApp3/ConsoleApp3/article.xml";

2. Daha sonra XmlTextReader sınıfına ait bir nesne oluşturulur ve parametre olarak pathi tutan dosya constructora yollanmak üzere gönderilir.

      XmlTextReader rdr = new XmlTextReader(dosya);

Daha sonra bir döngü yardımıyla xmlTextReader nesnesini kullanarak xml’in içinde okunacak herhangi bir node bulduğu sürece true dönen bir yapı oluşturmalıyız.

    while (rdr.Read()) //okunacak değer var ise true dön
    {
      if (rdr.NodeType == XmlNodeType.Element) //karşılaştığın node type bir element ise
      { Console.WriteLine("<"+rdr.Name+">"); }  //ekrana yazdır.

      if(rdr.NodeType == XmlNodeType.EndElement) //bir kapanış elementi ise
      { Console.WriteLine("</" + rdr.Name + ">"); } //ekrana yazdır.
    }

yukarıda if koşul yapısının içerisinde bizim xml dosyamızdaki nodeType  bir elemente veya kapanış elementine denk ise true dön ve yazdır dedik. XmlNodeType enumunda xml içerisinde karşılaşabileceğimiz her türlü nodeun karşılığı mevcuttur.

Textleri de yazdırmak için şu şekilde bir ekleme daha yapmamız gerekir.

    if (rdr.NodeType == XmlNodeType.Text)
    { Console.WriteLine(rdr.Value); }

3. Xmli okuyup ekrana bastırırken parent-child ilişkisinin daha rahat gözükebilmesi için boşlukların da belli bir düzende ekrana verilmesini istiyorsak   .Depth yani etiketin başlangıçtan itibaren kaç adet boşluk içerdiğini dönen property ile bu sayı kadar boşluk dönecek bir fonksiyon yazmalıyız.

  class Program
  {

     static void Main(string[] args)
    {

      string dosya = "C:/Users/LENOVO/documents/visual studio 2017/Projects/ConsoleApp3/ConsoleApp3/article.xml";

      XmlTextReader rdr = new XmlTextReader(dosya);

      while (rdr.Read())
      {
        if (rdr.NodeType == XmlNodeType.Element)
        { Console.WriteLine(bosluk(rdr.Depth*5)+"<"+rdr.Name+">"); }
        if(rdr.NodeType == XmlNodeType.EndElement)
        { Console.WriteLine(bosluk(rdr.Depth * 5) + "</" + rdr.Name + ">"); }
        if (rdr.NodeType == XmlNodeType.Text)
        { Console.WriteLine(bosluk(rdr.Depth * 5) + rdr.Value); }
     }

      Console.ReadKey();
    }
    public static string bosluk(int x) //aldıgı sayı degeri kadar bosluk dönen fonksiyon
    {
       string deger = "";
       for (int i = 0; i < x; i++)
       {
        deger += " ";
       }

       return deger;
    }

 }

4. Son olarak Xml etiketlerindeki attributeları da yazdırmak istersek aşağıdaki kodun son hali üzerinden hareket edebiliriz. Burada dikkat etmemiz gereken , attribute yazdırmak istersek hangi elementin attribute’a sahip olma ihtimali olduğunu göz önünde bulundurmamız gerekir. Bu da karmaşıklığa yol açabilir ancak bu xmlReader sınıfı için böyledir. Bu karmaşıklığı yok etmek için XmlDocument sınıfı kullanılabilir.

  class Program
 {

   static void Main(string[] args)
  {

    string dosya = "C:/Users/LENOVO/documents/visual studio 2017/Projects/ConsoleApp3/ConsoleApp3/article.xml";

    XmlTextReader rdr = new XmlTextReader(dosya);

    while (rdr.Read())
    {
       if (rdr.NodeType == XmlNodeType.Element && rdr.Name == "book1") //book elementinin attribute'a sahip olabileceğini düşünüyorsak...
       {
         if (rdr.HasAttributes) // ve eger sahipse
         { Console.WriteLine(bosluk(rdr.Depth * 5) + "<" + rdr.Name +" category = " + rdr.GetAttribute("category") + ">");  } //ekrana bastir.
       }
       else if (rdr.NodeType == XmlNodeType.Element)
       { Console.WriteLine(bosluk(rdr.Depth*5)+"<"+rdr.Name+">"); }
       if(rdr.NodeType == XmlNodeType.EndElement)
       { Console.WriteLine(bosluk(rdr.Depth * 5) + "</" + rdr.Name + ">"); }
       if (rdr.NodeType == XmlNodeType.Text)
       { Console.WriteLine(bosluk(rdr.Depth * 5) + rdr.Value); }
    }

    Console.ReadKey();
 }
  public static string bosluk(int x)
  {
     string deger = "";
     for (int i = 0; i < x; i++)
     {
      deger += " ";
     }

    return deger;
  }

}