C# xml işlemleri : Root>n*Sub
Tags: csharp, xml
Published: 2022-04-16 10:07:16

Diyelim ki aşağıdaki gibi bir xml dosyanız var : 

```
<?xml version="1.0" encoding="UTF-8"?>
<MyRootName>
    <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>
</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.

  - root içinde MySub adlı bir çok elementimiz var. MySub  c# da bir liste'ye denk eliyor

- 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.


### C# model'ini oluşturalım : 

-  MyRootName için > MyModelRootName class'ını oluşturalım (Not : bu class ın bir den çok MySub'ı olmalı).

-  MySub için > SubOfRoot class'ını oluşturalım. SubOfRoot un 2 tane property'si olmak zorunda (inceleyelim'deki 2. adım).

-  MyValueWithAttr için >  YourPropThatHaveAttr class'ını oluşturalım ve içerisinde attribute için bir string değeri ve kendi değeri için string değeri olması gerekiyor.

-  YourPropThatHaveAttr class'ını > SubOfRoot class'ına property olarak verellim.

Not: Yazılardan anlaşılması biraz zor. Önce koda bakıp daha sonra yazdıklarımı incelerseniz daha kolay anlaşılır.


```
    [XmlRoot(elementName:"MyRootName")]
    public class MyModelRootName
    {
        [XmlElement("MySub")]
        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; }
    }
```

### C# modelini oluşturduk daha sonra deserialize etme vakti : 

```
            var xmlOutput = File.ReadAllText(@"yourxmlfolderpath\MyXml1.xml");
            XmlSerializer xmlSerialize = new XmlSerializer(typeof(MyModelRootName));
            var xmlResult = xmlSerialize.Deserialize(new StringReader(xmlOutput));


```