2011-02-02 1 views
1

У меня возникли проблемы при сериализации типа .net и соответствие схеме 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

Смежные вопросы