Xml dosyalarını nasıl ayrıştırır, nasıl içerisinde ki değerlere ulaşabiliriz?

Xml (Extensible Markup Language) platform bağımsız bir işaretleme dilidir, farklı yazılım dillerinin birbirleri ile haberleşmesi için günümüzde oldukça sık kullanılır ve bir yazılımcının bunu tecrübe etmemesi imkansızdır diyebiliriz.

Şöyle bir senaryo düşünelim, bir erp yazılımımız var ve birde erp ile entegre çalışmasını istediğimiz bir eticaret sitesi var. Eticaret sitesi üzerinden sipariş alındığında bu siparişleri erp yazılımımıza otomatik kayıt etmek istiyoruz. Bunun için eticaret sitesinin bizimle paylaştığı bir link var ve bu linki açtığımızda  ise sitedeki siparişleri xml olarak bize geri döndürüyor. Peki biz bu xml i nasıl ayrıştırabilir ve nasıl veritabanına kayıt edebiliriz?

Örnek XML çıktısı

<root>
	<item>
		<id>1</id>
		<isim>Faruk XXXXX</isim>
		<tcno>XXXXXXXXXXX</tcno>
		<telefon>0532 XXX XX XX</telefon>
		<adres>Kadıköy</adres>
		<urunler>
			<item>
				<urunid>1</urunid>
				<kod>URN-001</kod>
				<adi>Iphone 5</adi>
				<miktar>1</miktar>
				<tutar>2000</tutar>
			</item>
			<item>
				<urunid>2</urunid>
				<kod>URN-002</kod>
				<adi>HTC One M7</adi>
				<miktar>1</miktar>
				<tutar>1800</tutar>
			</item>
		</urunler>
	</item>
	<item>
		<id>2</id>
		<isim>Kemal XXXXX</isim>
		<tcno>XXXXXXXXXXX</tcno>
		<telefon>0552 XXX XX XX</telefon>
		<adres>Büyükçekmece</adres>
		<urunler>
			<item>
				<urunid>1</urunid>
				<kod>URN-003</kod>
				<adi>Playstation 4</adi>
				<miktar>1</miktar>
				<tutar>3000</tutar>
			</item>
		</urunler>
	</item>
</root>

Eticaret sitesinin xml olarak dönen sipariş listesini örnek olarak yukarıda paylaştım.
İncelerseniz, root ana elementi altında item elementi görünüyor. Burada ki her bir item siparişi temsil ediyor. item altında urunler adında bir element bulunuyor, bu da tahmin edeceğiniz üzere o siparişe ait ürünlerin listesini. urunler elementinin altında ise yine item bulunuyor, yani siparişte ki her bir ürün. Şimdi, biz bu xml listesini nasıl parçalayıp bir foreach döngüsü içerisine alabiliriz. İnceleyelim.


string url = "www.testeticaretsitesi.com/siparisler";
XDocument list = XDocument.Load(url, LoadOptions.None);

// root elementi altında ki item listesine ulaşmak için 
// aşağıda ki foreach i yazıyoruz.
// Dikkat etmeniz gereken şey, ".Element" ile ".Elements" arasında ki fark
// Element bir satırı, Elements ise bir listeyi temsil eder.
// list.Element("root").Elements("item") burada belirtilmek istenen; root altında ki item ları listele
//
foreach (XElement siparis in list.Element("root").Elements("item"))
{
     int id = int.Parse(siparis.Element("id").Value.ToString());
     string isim = siparis.Element("isim").Value;
     string tcno = siparis.Element("tcno").Value;
     string telefon = siparis.Element("telefon").Value;
     string adres = siparis.Element("adres").Value;

     // Artık burada yukarıda ki bilgiler ile sipariş için siparişler tablosuna bir kayıt oluşturabiliriz
     // Veritabanı işlemleri

     // Artık siparişler tablosuna bir sipariş kaydı oluşturduğumuza göre şimdi, xml üzerinden bu siparişe ait olan
     // ürünleri döngüye alıp, siparişin ürünlerinin tutulduğu tabloya bunları kayıt etmeliyiz

     var siparisUrunler = siparis.Element("urunler").Elements("item");
     foreach (XElement siparisUrun in siparisUrunler)
     {
          int urunid = int.Parse(siparis.Element("urunid").Value.ToString());
          string kod = siparis.Element("kod").Value;
          string adi = siparis.Element("adi").Value;
          int miktar = int.Parse(siparis.Element("miktar").Value.ToString());
          float tutar = float.Parse(siparis.Element("tutar").Value.ToString());


          // Burada yukarıda ki bilgiler ile siparişe ait ürünlerin değerlerini alıyoruz.
          // Artık ürünleri sipariş ürünleri tablosuna kayıt edebiliriz.
     }
}