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.

Discussion (0)