2009-06-18 13 views
37

Tengo un problema con la serialización y el objeto, puedo conseguir que cree todas las salidas correctas excepto cuando tengo un Elemento que necesita un valor y un atributo. Aquí está la salida requerida:Cómo agregar atributos para la serialización de XML de C#

<Root> 
    <Method>Retrieve</Method> 
    <Options> 
    <Filter> 
     <Times> 
     <TimeFrom>2009-06-17</TimeFrom> 
     </Times> 
     <Document type="word">document name</Document> 
    </Filter> 
    </Options> 
</AdCourierAPI> 

puedo construir todo, pero no puedo encontrar una manera de establecer el atributo de tipo de documento, aquí es un segmento de la clase de objeto

[XmlRoot("Root"), Serializable]  
public class Root  
{  
    [XmlElement("Method")]  
    public string method="RetrieveApplications";  
    [XmlElement("Options")]  
    public _Options Options;  
}  
public class _Options  
{ 
    [XmlElement("Filter")]  
    public _Filter Filter;  
} 
public class _Filter  
{ 
    [XmlElement("Times")]  
    public _Times Times;  
    [XmlElement("Documents")]  
    public string Documents;  
} 

que me da :

<Document>document name</Document> 

en lugar de:

<Document type="word">document name</Document> 

pero no puedo encontrar una manera de corregir esto, por favor avise.

Gracias

+0

Lo sentimos Marc ... Has debido simplemente tiene que editar delante de mí. – Kev

+0

¡Mark Gravell me salvó el día! :-) ¡Gracias! –

Respuesta

56

¿Dónde tienes la type almacenan?

Normalmente usted podría tener algo como:

class Document { 
    [XmlAttribute("type")] 
    public string Type { get; set; } 
    [XmlText] 
    public string Name { get; set; } 
} 


public class _Filter  
{ 
    [XmlElement("Times")]  
    public _Times Times;  
    [XmlElement("Document")]  
    public Document Document;  
} 
+0

Gracias Chicos, ordenados, muy apreciados – user107779

+0

que no funciona para mí –

+0

Wow esto es increíble, esperaba que esto fuera mucho más complejo. – Sizons

11

La clase string no tiene una propiedad type, por lo que no pueden utilizarlo para crear la salida deseada. Debe crear una clase Document lugar:

public class Document 
{ 
    [XmlText] 
    public string Name; 

    [XmlAttribute("type")] 
    public string Type; 
} 

Y usted debe cambiar la propiedad Document para escribir Document

+0

Estoy de acuerdo (estaba a punto de enviar lo mismo!) –

7

Suena como que necesita una clase extra:

public class Document 
{ 
    [XmlAttribute("type")] 
    public string Type { get; set; } 
    [XmlText] 
    public string Name { get; set; } 
} 

Cuando una instancia (en el ejemplo) tendría Type = "word" y Name = "document name"; documents sería List<Document>.

Por cierto - los campos públicos rara vez son una buena idea ...

Cuestiones relacionadas