DEV Community

MustafaSamedYeyin
MustafaSamedYeyin

Posted on

3 2

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

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay