Serialize object to element with attributes and children

后端 未结 1 1249
既然无缘
既然无缘 2020-12-14 05:02

I wish to define classes that will produce the following xml using System.Xml.Serialization.XmlSerializer. I am struggling to get the items list, with attributes that does

相关标签:
1条回答
  • 2020-12-14 05:57

    with XmlSerializer things are either lists or they have members. To do that you need:

    [XmlRoot("myroot")]
    public class MyRoot {
        [XmlElement("items")]
        public MyListWrapper Items {get;set;}
    }
    
    public class MyListWrapper {
        [XmlAttribute("attr1")]
        public string Attribute1 {get;set;}
        [XmlAttribute("attr2")]
        public string Attribute2 {get;set;}
        [XmlElement("item")]
        public List<MyItem> Items {get;set;}
    }
    public class MyItem {
        [XmlAttribute("id")]
        public int Id {get;set;}
    }
    

    with example:

    var ser = new XmlSerializer(typeof(MyRoot));
    var obj = new MyRoot
    {
        Items = new MyListWrapper
        {
            Attribute1 = "hello",
            Attribute2 = "world",
            Items = new List<MyItem>
            {
                new MyItem { Id = 1},
                new MyItem { Id = 2},
                new MyItem { Id = 3}
            }
        }
    };
    ser.Serialize(Console.Out, obj);
    

    which generates:

    <myroot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://
    www.w3.org/2001/XMLSchema">
      <items attr1="hello" attr2="world">
        <item id="1" />
        <item id="2" />
        <item id="3" />
      </items>
    </myroot>
    

    you can remove the xsi/xsd namespace aliases if you want, of course.

    0 讨论(0)
提交回复
热议问题