2011-02-02 17 views
1

.net型をシリアル化し、要素のシーケンスに追加のコンテナ要素(この例ではList)を追加するXMLスキーマに従うと、問題が発生します。XmlArray(Xml.Serialization)に内部要素を追加

<Items>       
    <List>     
    <Item> 
    <Field1/> 
    <Field2/> 
    </Item> 
    <Item> 
    <Field1/> 
    <Field2/> 
    </Item> 
    </List>   
</Items> 

XmlArray属性が単一の要素(アイテム)をマッピングするための唯一の可能性を与えているようです:

[XmlArray("items", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    [XmlArrayItem("item", typeof(OrderItemsItem), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)] 
    public OrderItemsItem[] Items { 
     get { 
      return this.itemsField; 
     } 
     set { 
      this.itemsField = value; 
     } 
    } 

答えて

0

私はこれを見て、私は形作るために見ることができる唯一の方法を持っていましたそのようなデータは、モデル内の余分なレベルでモデル化することです:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Xml.Serialization; 
static class Program 
{ 
    static void Main() 
    { 
     var foo = new Foo { Items = { new OrderItemsItem(), new OrderItemsItem() } }; 
     var ser = new XmlSerializer(typeof(Foo)); 
     ser.Serialize(Console.Out, foo); 

    } 

} 
public class OrderItemsItem { } 
public class Foo 
{ 
    private FooItems items = new FooItems(); 

    // this one is for serialization, but tried to be invisible otherwise 
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
    [XmlElement("Items")] 
    public FooItems WrappedItems { get { return items; } set { items = value; } } 

    // this one is for general use 
    [XmlIgnore] 
    public List<OrderItemsItem> Items { get { return items.Items; } } 

    public class FooItems 
    { 
     private readonly List<OrderItemsItem> items = new List<OrderItemsItem>(); 
     [XmlArray("List"), XmlArrayItem("Item")] 
     public List<OrderItemsItem> Items { get { return items; } } 
    } 
} 
+0

マークさん、ありがとうございます。ここには正しいアプローチがあるようです。 – Fab60

関連する問題