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>
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; }
}
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));
Bir dahaki yazıda biraz dahafazla kompleks bir örnek vereceğim şimdilik görüşmek üzere.
Top comments (0)