2009-06-18 9 views
37

Je rencontre un problème avec la sérialisation et l'objet, je peux l'obtenir pour créer toutes les sorties correctes, sauf si j'ai un élément qui a besoin d'une valeur et d'un attribut. Voici la sortie requise:Comment ajouter des attributs pour la sérialisation C# XML

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

je peux construire tout cela mais ne peut pas trouver un moyen de définir l'attribut de type de document, voici une partie de la classe d'objets

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

qui me donne :

<Document>document name</Document> 

plutôt que:

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

mais je ne peux pas trouver un moyen de corriger cela, s'il vous plaît aviser.

Merci

+0

Désolé Marc ... vous dű réussi a faire modifier devant moi. – Kev

+0

Mark Gravell a sauvé ma journée! :-) Je vous remercie! –

Répondre

56

Où avez-vous le type stocké?

Normalement, vous pourriez avoir quelque chose comme:

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

Merci les gars, triés, très apprécié – user107779

+0

ne fonctionne pas pour moi –

+0

Wow c'est incroyable, je m'attendais à ce que ce soit beaucoup plus complexe. – Sizons

11

La classe string ne dispose pas d'une propriété type, donc vous ne pouvez pas l'utiliser pour créer la sortie désirée. Vous devez créer une classe à la place Document:

public class Document 
{ 
    [XmlText] 
    public string Name; 

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

Et vous devez modifier la propriété Document taper Document

+0

Je suis d'accord (était sur le point de soumettre la même chose!) –

7

On dirait que vous avez besoin d'une classe supplémentaire:

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

Lorsqu'une instance (en l'exemple) aurait Type = "word" et Name = "document name"; documents serait un List<Document>.

Par ailleurs - champs publics sont rarement une bonne idée ...

Questions connexes