Bilgehan Yıldız'a bu değerli yazısı için teşekkür ederiz
Xdocument XmlDocument gibi xml dosyalarını oluşturma,okuma vs gibi işlemlerimiz için kullanabileceğimiz ,bunları yaparken de linq destekli işlemleri kullanmamıza olanak sağlayan bir classdır. Bu tarz özellikleri sayesinde xml üstünde işlem yapılmasını oldukça kolaylaştıran bir classtır. Bu özellik .Net3.5 ve sonrasında mevcuttur.
Örnek olarak aşağıdaki gibi bir sınıf yapımız olsun(Person).Bu Sınıf yapımızı örnek test setleri ile doldurarak liste halinde data sunan ikinci bir sınıf daha ekleyelim(PersonRepository)
Kod:
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
public class PersonRepository
{
public List<Person> GetPersonList()
{
List<Person> PersonList = new List<Person>(){
new Person() { ID = 1, Name = “Bilgehan”, Age = 27 },
new Person() { ID = 1, Name = “Tolga”, Age = 30 },
new Person() { ID = 1, Name = “Murat”, Age = 30 },
new Person() { ID = 1, Name = “Yasin”, Age = 25 }
};
return PersonList;
}
}
Örnek 1 Gelen Listeyi XML Formatına dönüştürme
Bundan sonra ikinci aşamada ise bize bu listeyi xml yapısına dönüştürecek kodlarımızı yazalım.Bunun için örnek olması amacıyla uygulamamıza bir textbox ve buton atarak butonun arkasına aşağıdaki kodlarımızı yazalım.
Kod:
PersonRepository pRepository=new PersonRepository();
List<Person> PersonXmlList = pRepository.GetPersonList();
XDocument xDoc = new XDocument(
new XComment(“starting xml”),
new XElement(“PersonList”,
PersonXmlList.Select(x => new XElement(“Person”, new XAttribute(“ID”, x.ID), new XAttribute(“Name”, x.Name), new XAttribute(“Age”, x.Age)))));
xDoc.Declaration= new XDeclaration(“1.0″, “UTF-8″, “yes”);
txtShow.Text = xDoc.ToString();
Çıktıdanda görüldüğü üzere Linq desteği sayesinde elimizdeki listeyi tek satır kodla XmlFormatına dönüştürebiliyoruz.
Kod:
xDoc.Declaration= new XDeclaration("1.0", "UTF-8", "yes"); satırı ile eğer bir xml dosyası oluşturarak
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
standardını vermemiz mümkündür
Not2: new XComment(“starting xml”), XComment kodu ilede nodelar arası açıklama satırları koymamıza olanak sağlar
Örnek 2 Bir XML Dosyasını okuyarak Parse Etmek
Örnek olarak projemize aşağıdaki gibi bir xml dosyasını ekleyelim
Kod:
<?xml version=“1.0“ encoding=“utf-8“ ?>
<MyDb>
<PersonList>
<Person ID=“1“ Name=“Bilgehan“ Age=“27“ >
<Mail>bilge@yildiz.com</Mail>
<Mail>bilgehan13@yildiz.com</Mail>
</Person>
<Person ID=“1“ Name=“Tolga“ Age=“30“>
<Mail>tolga@abc.com</Mail>
</Person>
<Person ID=“1“ Name=“Murat“ Age=“30“ />
<Person ID=“1“ Name=“Yasin“ Age=“25“ />
</PersonList>
<CarList>
<Car ID=“1“ Brand=“Volvo“ >C30</Car>
<Car ID=“2“ Brand=“BMW“ >X5</Car>
<Car ID=“1“ Brand=“Hyundai“ >i30</Car>
</CarList>
</MyDb>
Şimdi bize sistemde bulunan kişilere ait mail listesini verecek bir örnek yapalım
Bunun için ekranımıza ikinci bir buton koyarak xmlden okudugumuz mail adreslerini textboxa yazacak bir kod yazalım
Kod:
protected void btnReadXmlFile_Click(object sender, EventArgs e)
{
string filename = Server.MapPath(@”/XMLSample.xml”);
XDocument xml = XDocument.Load(filename);
var q = from b in xml.Descendants(“Person”).Descendants(“Mail”)
select b.Value;
foreach (string item in q.ToList())
{
txtShow.Text += item+“;”;
};
}
Burada birinci olarak yaptıgımız şey XDocument.Load komutu ile ilgili xml memory yüklemek daha sonra ise Descendants yardımı ile XName matching olan elemanları yakalıyoruz. xml.Descendants(“Person”).Descendants(“Mail”) bu şekilde ise ilk olarak Person elementlerini yakalıyor.Daha sonra ise person içindeki mail elementlerini yakalıyor.Örnek xmlimizde <Mail>bilge@yildiz.com</Mail> şeklinde oldugu için ilgili elemente gittiğimizde .Value diyerek ilgili değerlere ulaşabiliyoruz
<Car ID=”1″ Brand=”Hyundai” >i30</Car>
<Car ID=”2″ Brand=”BMW” >X5</Car>
Peki bu örneğimizdeki gibi Brand içindeki değere ulaşmak isteseydik o zaman ise sorgumuzu aşağıdaki şekilde yazmak yeterli olacaktı.Burada Brand Car elementinin bir Attribute oldugu için Descendants ile Car elementlerşne ulaşıp daha sonra .Attribute( içine Attribute adını yazarak) değerine ulaşmamız mümkündür
var q = from b in xml.Descendants(“Car”)
select b.Attribute(“Brand”).Value;
Örnek 3 XDocument.Parse komutu
Gelen bir string eğer xml formatında ise XDocument.Parse metodunu kullanarak bunu xml haline getirerek nodelar arasında işlem yapmamıza olanak sağlar
Aşağıdaki kod örneği sonuç olarak xml şeklindeki bir stringde yazan Bilgehan değerini okumamızı sağlar
Kod:
string stringxml =
@”<?xml version=”"1.0″”?>
<Personlist>
<Person>Bilgehan</Person>
</Personlist>”;
XDocument xml = XDocument.Parse(stringxml);
var q = from b in xml.Descendants(“Person”)
select b.Value;
foreach (string item in q.ToList())
{
txtShow.Text += item + “;”;
};
}