C# 将对象序列化为具有属性和子元素的元素

C# 将对象序列化为具有属性和子元素的元素,c#,xml-serialization,xmlserializer,C#,Xml Serialization,Xmlserializer,我希望使用System.xml.Serialization.XmlSerializer定义将生成以下xml的类。我正在努力获取项目列表,属性不包含“item”元素的子“container”元素 <?xml version="1.0" ?> <myroot> <items attr1="hello" attr2="world"> <item id="1" /> <item id="2" /> &l

我希望使用System.xml.Serialization.XmlSerializer定义将生成以下xml的类。我正在努力获取项目列表,属性不包含“item”元素的子“container”元素

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

使用
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;}
}
[XmlRoot(“myroot”)]
公共类MyRoot{
[XmlElement(“项目”)]
公共MyListWrapper项{get;set;}
}
公共类MyListWrapper{
[XmlAttribute(“attr1”)]
公共字符串Attribute1{get;set;}
[xmldattribute(“attr2”)]
公共字符串Attribute2{get;set;}
[XmlElement(“项目”)]
公共列表项{get;set;}
}
公共类MyItem{
[XmlAttribute(“id”)]
公共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);
var ser=new-XmlSerializer(typeof(MyRoot));
var obj=新的MyRoot
{
Items=新的MyListWrapper
{
Attribute1=“你好”,
Attribute2=“世界”,
项目=新列表
{
新的MyItem{Id=1},
新的MyItem{Id=2},
新MyItem{Id=3}
}
}
};
序列序列化(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
名称空间别名。

如果我的理解是正确的,您不能创建包含Item类集合的Items类吗?这是正确的,但是Items元素必须具有属性。是的,我们不能在Items类中定义其他属性吗?哇,太棒了。它将包装器中的“Items”集合标记为简单的XmlElement,而不是我缺少的XmlArrayItem。非常感谢你!谢谢你的回答,但是当xml中只有一个成员时,我的子成员就不会被填充。你知道为什么吗?谢谢:)@Gareth几乎可以肯定地说“是的,我可以帮上忙”,但如果您能向我展示您试图使用的XML和类,那就真的很有帮助了。