Сериализация объекта в элемент с атрибутами и потомками - PullRequest
8 голосов
/ 28 июня 2011

Я хочу определить классы, которые будут генерировать следующий xml, используя System.Xml.Serialization.XmlSerializer. Я изо всех сил пытаюсь получить список элементов с атрибутами, которые не содержат дочерний элемент «контейнер» для элементов «элемент».

<?xml version="1.0" ?>
<myroot>
   <items attr1="hello" attr2="world">
      <item id="1" />
      <item id="2" />
      <item id="3" />
   </items>
</myroot>

1 Ответ

18 голосов
/ 28 июня 2011

с XmlSerializer вещами являются либо списками или у них есть участники. Для этого вам нужно:

[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;}
}

с примером:

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

, который генерирует:

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

Вы можете удалить псевдонимы пространства имен xsi / xsd, если хотите, конечно.

...