2011-06-28 34 views
8

Deseo definir las clases que producirán el siguiente xml usando System.Xml.Serialization.XmlSerializer. Estoy luchando por obtener la lista de elementos, con atributos que no contienen un elemento infantil 'contenedor' para los elementos 'elemento'.Serializar objeto al elemento con atributos e hijos

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

Si mi comprensión es correcta, ¿no puede crear elementos de clase que tiene una colección de clase de elemento? – Novice

+0

Eso es correcto, pero el elemento items tiene que tener atributos. – Sprintstar

+0

Sí, ¿no podemos definir otras propiedades también dentro de la clase de elementos? – Novice

Respuesta

18

con XmlSerializer cosas son ya sea listas o que tienen miembros. Para ello es necesario:

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

con el ejemplo:

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

que genera:

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

puede eliminar los xsi/xsd alias de espacio de nombres si lo desea, por supuesto.

+0

Guau, increíble trabajo Marc. Estaba marcando la colección 'Artículos' en el contenedor como simplemente XmlElement, en lugar de XmlArrayItem que me faltaba. Muchas gracias! – Sprintstar

Cuestiones relacionadas