DEV Community

MustafaSamedYeyin
MustafaSamedYeyin

Posted on

C# xml işlemleri : Root>SubParent>n*Sub

Diyelim ki aşağıdaki gibi MyXml2.xml dosyamız olsun :

<?xml version="1.0" encoding="UTF-8"?> <MyRootName> <SubParent> <MySub> <MyValue1> 5 </MyValue1> <MyValue2> <![CDATA[Something2]]> </MyValue2> <MyValueWithAttr ValueOfElementsAttribute="SomethingAttr"> <![CDATA[Something3]]> </MyValueWithAttr> </MySub> <MySub> <MyValue1> 5 </MyValue1> <MyValue2> <![CDATA[Something2]]> </MyValue2> <MyValueWithAttr ValueOfElementsAttribute="SomethingAttr"> <![CDATA[Something3]]> </MyValueWithAttr> </MySub> <MySub> <MyValue1> 5 </MyValue1> <MyValue2> <![CDATA[Something2]]> </MyValue2> <MyValueWithAttr ValueOfElementsAttribute="SomethingAttr"> <![CDATA[Something3]]> </MyValueWithAttr> </MySub> <MySub> <MyValue1> 5 </MyValue1> <MyValue2> <![CDATA[Something2]]> </MyValue2> <MyValueWithAttr ValueOfElementsAttribute="SomethingAttr"> <![CDATA[Something3]]> </MyValueWithAttr> </MySub> <MySub> <MyValue1> 5 </MyValue1> <MyValue2> <![CDATA[Something2]]> </MyValue2> <MyValueWithAttr ValueOfElementsAttribute="SomethingAttr"> <![CDATA[Something3]]> </MyValueWithAttr> </MySub> <MySub> <MyValue1> 5 </MyValue1> <MyValue2> <![CDATA[Something2]]> </MyValue2> <MyValueWithAttr ValueOfElementsAttribute="SomethingAttr"> <![CDATA[Something3]]> </MyValueWithAttr> </MySub> </SubParent> </MyRootName> 
Enter fullscreen mode Exit fullscreen mode

Ve bunu c# class'ına deserialize etmek istiyorsunuz :

Bunun için öncelikle xml inceleyelim :

  • MyRootName adında bir root'umuz var. MyRootName c# da bir class a denk geliyor.

  • MyRootName içinde bir bir SubParent'ımız var ve bu SubParent bir MySub'ları içeren bir array.

  • mysub ın altında value lerimiz varve bunların ilk 2 si c# da property'ye denk geliyor.

  • MyValueWithAttr adında iki tane değeri olan(attribute değeri ve kendi değeri) olan bir xml elementimiz var. 2 tane değer olduğundan dolayı bir class gerekiyor.

Direkt model'e geçmek istiyorum :

[XmlRoot(elementName:"MyRootName")] public class MyModelRootName { [XmlArray("SubParent")] // dikkat 1 yazı ile farkı buralar [XmlArrayItem("MySub")] // dikkat 1 yazı ile farkı buralar public List<SubOfRoot> SubOfRoots { get; set; } } public class SubOfRoot { [XmlElement(elementName: "MyValue1")] public int YourValue1 { get; set; } [XmlElement(elementName: "MyValue2")] public string YourValue2 { get; set; } [XmlElement(elementName: "MyValueWithAttr")] public YourPropThatHaveAttr YourPropThatHaveAttr { get; set; } } public class YourPropThatHaveAttr { [XmlText] public string ValueOfElement { get; set; } [XmlAttribute] public string ValueOfElementsAttribute { get; set; } } 
Enter fullscreen mode Exit fullscreen mode

Bu serinin 1. yazısını okuduysanız tek farkın Root içerisinde XmlElement yerine XmlArray ve XmlArrayItem kullandığımız görebilirisiniz.

Yani aslında root elementi için konuşursak : Eğer bir root unuz var ve içerisinde root'a ait birden çok item bulunuyorsa (Root>n*Sub) XmlElement kullanmalısınız. Eğer Root içerisinde bir element ve bu elementin içerisinde bir den çok item (Root>SubParent>n*Sub) bulunuyorsa XmlArray ve XmlArrayItem kullanmalısınız.

Kullanım :

 var xmlOutput = File.ReadAllText(@"yourFolderPath\MyXml2.xml"); XmlSerializer xmlSerialize = new XmlSerializer(typeof(MyModelRootName)); var xmlResult = xmlSerialize.Deserialize(new StringReader(xmlOutput)); 
Enter fullscreen mode Exit fullscreen mode

Bir dahaki yazıda biraz dahafazla kompleks bir örnek vereceğim şimdilik görüşmek üzere.

Top comments (0)