2011-06-28 13 views
8

System.Xml.Serialization.XmlSerializer kullanarak aşağıdaki xml'yi üretecek sınıfları tanımlamak istiyorum. 'Öğe' öğeleri için bir 'kapsayıcı' öğesi içermeyen özniteliklerle öğeler listesini almak için mücadele ediyorum.Nitelikler ve alt öğelerle nesneyi seri hale getirme

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

Anlayışım doğruysa, Item sınıfı koleksiyonuna sahip Items sınıfı oluşturamaz mısınız? – Novice

+0

Bu doğru, ancak öğeler öğesinin özelliklerine sahip olması gerekiyor. – Sprintstar

+0

Evet, item sınıfındaki diğer özellikleri de tanımlayamıyor muyuz? – Novice

cevap

18

XmlSerializer aranız ya listeleri veya onlar üyeye sahip bulunmaktadır. İhtiyacınız Bunu yapmak için:

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

örnekle:

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

üretir: İsterseniz

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

elbette, xsi/xsd ad takma adları kaldırabilir.

+0

Vay, harika iş Marc. Sarmadaki 'Items' koleksiyonunu, eksik olduğum XmlArrayItem yerine sadece XmlElement olarak işaretliyordu. Çok teşekkür ederim! – Sprintstar