DEV Community

MustafaSamedYeyin
MustafaSamedYeyin

Posted on

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

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>

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.

    • 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; }
    }
Enter fullscreen mode Exit fullscreen mode

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));


Enter fullscreen mode Exit fullscreen mode

Discussion (0)