2010-01-06 2 views
6

Espérons qu'une question avec une réponse très simple, mais ce n'est pas celle que j'ai pu trouver. J'ai un petit document XML qui ressemble à peu près comme ceci:En C# comment désérialiser un document XML contenant une liste d'éléments sans élément de liste environnant

<aa> 
    <bb><name>bb1</name></bb> 
    <bb><name>bb2</name></bb> 
    <bb><name>bb3</name></bb> 
</aa> 

J'ai des classes qui représentent aa et bb

[XmlRoot("aa")] 
public class aa 
{ 
    [XmlArray("bbs")] 
    [XmlArrayItem("bb")] 
    public bb[] bbs; 
} 

public class bb 
{ 
    [XmlElement("name")] 
    public string Name; 
} 

Lorsque je tente de désérialiser le document à l'aide d'un XmlSerializer je reçois un objet aa avec une propriété null bbs. Si je comprends bien c'est parce que les attributs que j'ai utilisé sur la propriété bbs disent sérialiseur d'attendre un document comme celui-ci:

<aa> 
    <bbs> 
    <bb><name>bb1</name></bb> 
    <bb><name>bb2</name></bb> 
    <bb><name>bb3</name></bb> 
    </bbs> 
</aa> 

Étant donné que je ne peux pas changer le format du fichier XML que je reçois, est il existe un moyen de dire à XmlSerialiser d'attendre un tableau qui n'est pas enveloppé dans une autre balise?

Répondre

8

Essayez de remplacer vos [XmlArray("bbs")] et [XmlArrayItem("bb")] attributs avec un seul [XmlElement] attribut

[XmlRoot("aa")] 
public class aa 
{ 
    [XmlElement("bb")] 
    public bb[] bbs; 
} 

public class bb 
{ 
    [XmlElement("name")] 
    public string Name; 
} 

En mettant l'Array et ArrayItem attributs, vous décriviez explicitement comment sérialisez comme un tableau avec récipient d'emballage.

+0

Parfait, merci – Dan

4

Changez votre [XmlArray]/[XmlArrayItem] en [XmlElement], qui indique au sérialiseur que les éléments n'ont pas d'enveloppe, par ex.

[XmlRoot("aa")] 
public class aa 
{ 
    [XmlElement("bb")] 
    public bb[] bbs; 
} 

public class bb 
{ 
    [XmlElement("name")] 
    public string Name; 
} 
Questions connexes