C# xml işlemleri : Root>SubParent>n*Sub
Published: 2022-04-16 17:19:05

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.