web-dev-qa-db-fra.com

Comment ajouter des attributs pour la sérialisation XML C #

J'ai un problème avec la sérialisation et l'objet, je peux l'obtenir pour créer toutes les sorties correctes, sauf lorsque j'ai un élément qui a besoin d'une valeur et d'un attribut. Voici la sortie requise:

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

Je peux tout construire mais je ne trouve pas de moyen de définir l'attribut Type de document, voici un segment 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;    
}

ce 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, veuillez conseiller.

Merci

37
user107779

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;    
}
56
bruno conde

La classe string n'a pas de propriété type, vous ne pouvez donc pas l'utiliser pour créer la sortie souhaitée. Vous devez plutôt créer une classe Document:

public class Document
{
    [XmlText]
    public string Name;

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

Et vous devez changer la propriété Document pour taper Document

11
Thomas Levesque

Il semble que vous ayez besoin d'un cours supplémentaire:

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

Où une instance (dans l'exemple) aurait Type = "Word" et Name = "document name"; documents serait un List<Document>.

Soit dit en passant - les domaines publics sont rarement une bonne idée ...

8
Marc Gravell