2011-05-14 21 views
5

Tengo algunos XML que estoy consumiendo y deserializando.Deserializando XML, ¿cómo accedo a los atributos?

<Foo> 
    <Bars Baz="9"> 
     <Bar>...</Bar> 
     <Bar>...</Bar> 
    </Bars> 
</Foo> 

Actualmente me Deserialize a esta clase:

[XmlRoot("Foo")] 
public class Foo 
{ 
    public Foo() { } 

    [XmlArrayItem("Bar")] 
    public Bar[] Bars { get; set; } 
} 

Esto funciona bien, excepto que no captan el valor de @Baz. Quiero agregar Baz como una propiedad de Foo, pero no estoy seguro de cómo. ¿Qué atributo debo configurar en mi propiedad Baz para deserializar correctamente el xml?

[WhatAttributeGoesHere("?")] 
public int Baz { get; set; } 

Respuesta

9

Normalmente:

[XmlAttribute] 

(con nombre opcional, espacio de nombres, etc.) es lo que está después.

Sin embargo, no puede usar eso directamente en una colección. En su lugar, necesitaría tener una clase contenedora para Bars, con el atributo y un:

public class Foo { 
    public BarWrapper Bars {get;set;} 
} 
public class BarWrapper { 
    private readonly List<Bar> bars = new List<Bar>(); 
    [XmlElement("Bar")] 
    public List<Bar> Items {get{return bars;}} 

    [XmlAttribute] 
    public int Baz {get;set;} 
} 
public class Bar {...} 
+0

Sí, eso es lo que estoy tratando de evitar. ¿Hay alguna forma de acceder al atributo sin crear una subclase? – gilly3

+1

@ gilly3 con XmlSerializer? Solo implementando IXmlSerializable; y si tuviera la opción, elegiría una capa adicional en mi DTO :) –

+0

¡Ya no voy a ir allí! Creo que tendré que absorberlo y agregar la capa extra. – gilly3

Cuestiones relacionadas