2011-06-28 63 views
8

我希望定義將使用System.Xml.Serialization.XmlSerializer生成以下xml的類。我正在努力獲得項目列表,其中不包含「item」元素的子容器元素的屬性。將對象序列化爲具有屬性和子元素的元素

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

如果我的理解是正確的,你不能創建具有Item類集合的Items類嗎? – Novice

+0

這是正確的,但items元素必須具有屬性。 – Sprintstar

+0

是的,我們不能在商品類中定義其他屬性嗎? – Novice

回答

18

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命名空間別名。

+0

哇,令人敬畏的工作馬克。它將包裝中的'Items'集合標記爲XmlElement,而不是我缺少的XmlArrayItem。非常感謝! – Sprintstar

相關問題