2011-11-24 13 views
16

Quiero crear una estructura XML personalizado de la siguiente manera:¿Cómo configuro el nombre del elemento XmlArrayItem para una implementación de la lista <Custom>?

<Hotels> 
    <Hotel /> 
</Hotels> 

He creado una implementación de List sólo para ser capaz de hacer esto. Mi código es el siguiente:

[XmlRootAttribute(ElementName="Hotels")] 
public class HotelList: List<HotelBasic> 

Debido a que la clase que contiene la lista no se nombra pero HotelHotelBasic mi XML es como

<Hotels> 
    <HotelBasic /> 
</Hotels> 

¿Cómo puedo solucionar este problema sin tener que implementar ISerializable o IEnumerable?

+0

¿Quieres serializar o deserializar? – abatishchev

Respuesta

14

Suponiendo que está usando XmlSerializer, si lo que quieres hacer es cambiar la forma en que su clase HotelBasic es serializado, puede utilizar XmlTypeAttribute:

[XmlType(TypeName = "Hotel")] 
public class HotelBasic 
{ 
    public string Name { get; set; } 
} 

Cuando se utiliza con la clase HotelList será serializado como:

<Hotels xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Hotel> 
    <Name>One</Name> 
    </Hotel> 
    <Hotel> 
    <Name>Two</Name> 
    </Hotel> 
</Hotels> 
22
[XmlArray("Hotels")] 
[XmlArrayItem(typeof(Hotel), ElementName="Hotel")] 
public HotelList[] Messages { get; set; } 

debería producir:

<Hotels> 
    <Hotel /> 
    <Hotel /> 
</Hotels> 

[XmlRoot("Hotels")] 
public class HotelList : IXmlSerializable 
{ 
    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     this.Hotels = XDocument.Load(reader) 
           .Select(h => new Hotel { Name = (string)h.Attribute("name") } 
           .ToList(); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     throw new NotSupportedException(); 
    } 
} 
+0

Necesito usar List , no HotelBasic [] – Odys

+0

@odyodyodys: 1. XmlSerializer solo admite array. 2. Solicitó 'IEnumerable ', array lo implementa. 3. No desea 'List ' porque es un contenedor desechable, pero la lista en xml es * final *. 4. Puede crear una lista de llamadas 'ToList()'. – abatishchev

+0

Estoy usando los métodos 'List's como Find y mucho más. Sería doloroso volver a implementar 'List' – Odys

6

Creo madd0 muestra la opción más sencilla para usted aquí, pero simplemente para la corrección ... personalmente No recomiendo el "serializar la lista como el objeto raíz "- por varias razones (incluyendo: he visto que esos atributos no funcionan al menos en la plataforma) podrían haber sido CF o SL, no lo recuerdo). En su lugar, yo siempre aconsejo el uso de un tipo de raíz personalizado:

[XmlRoot("Hotels")] 
public class HotelResult // or something similar 
{ 
    [XmlElement("Hotel")] 
    public List<HotelBasic> Hotels { get { return hotel; } } 

    private readonly List<HotelBasic> hotels = new List<HotelBasic>(); 
} 

Esto tendrá la misma estructura XML, y permite una mayor flexibilidad (se pueden añadir otros atributos/elementos a la raíz), y no hornear en List<T> su modelo de tipo (prefiere la encapsulación sobre la herencia, etc.).

Cuestiones relacionadas