2011-06-28 32 views
8

Tôi muốn xác định các lớp sẽ tạo ra xml sau bằng System.Xml.Serialization.XmlSerializer. Tôi đang cố gắng để có được danh sách các mục, với các thuộc tính không chứa phần tử con 'container' cho các phần tử 'item'.Nối tiếp đối tượng thành phần tử với thuộc tính và trẻ em

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

Nếu hiểu biết của tôi là chính xác, bạn không thể tạo lớp Hạng mục có tập hợp hạng mục? – Novice

+0

Đúng vậy, nhưng phần tử của mục phải có các thuộc tính. – Sprintstar

+0

Có, chúng tôi không thể xác định các thuộc tính khác cũng nằm trong lớp mục? – Novice

Trả lời

18

với XmlSerializer điều là hoặc danh sách hoặc họ có các thành viên. Để làm điều đó bạn cần:

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

với ví dụ:

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

mà tạo ra:

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

bạn có thể loại bỏ các bí danh namespace xsi/xsd nếu bạn muốn, tất nhiên.

+0

Wow, công việc tuyệt vời Marc. Nó đã được đánh dấu bộ sưu tập 'Items' trong wrapper đơn giản chỉ là XmlElement, chứ không phải là XmlArrayItem mà tôi đã bỏ lỡ. Cảm ơn bạn rất nhiều! – Sprintstar

Các vấn đề liên quan