2011-06-28 11 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

すごい、すばらしい作品Marc。私が欠けていたXmlArrayItemではなく、単にXmlElementとしてラッパーの 'Items'コレクションをマークしていました。どうもありがとうございます! – Sprintstar

関連する問題