2010-05-20 2 views
1

J'ai la partie XML suivante dont je ne peux pas changer le schéma. NUMÉRO, REGION, MENTION, FÉDÉRALE colonnes:XmlSerializer - Désérialise différents éléments en tant que collection du même élément

<COLUMNS LIST="20" PAGE="1" INDEX="reg_id"> 
    <NUMBER WIDTH="3"/> 
    <REGION WIDTH="60"/> 
    <MENTION WIDTH="7"/> 
    <FEDERAL WIDTH="30"/> 
</COLUMNS> 

Je veux désérialiser à public List<Column> Columns {get;set;} propriété. Donc le nom de l'élément irait à Column.Name. Classe de colonne:

public class Column 
{ 
    //Name goes from Element Name 
    public string Name {get;set;} 
    [XmlAttribute("WIDTH")] 
    public int Width {get;set;} 
} 

Est-ce possible avec la classe XmlSerializer?

Répondre

2

Si vous n'êtes pas autorisé à modifier le schéma, le schéma est plus susceptible de ne pas changer. (Si ce n'est pas une hypothèse valide, s'il vous plaît laissez-moi savoir.) Dans ce cas, l'utilisation de XmlSerializer peut-être bien trop. Pourquoi ne pas utiliser Linq en XML? Le snippit ci-dessus charge votre exemple XML et crée ensuite une énumération de colonnes à partir de celui-ci. Simple et efficace. Cependant, cela nécessite .NET 3.0 ou plus tard, donc si ce n'est pas une option pour vous, alors ce n'est pas la solution pour vous, malheureusement.

Un lien vers LINQ de Microsoft à la documentation XML:

http://msdn.microsoft.com/en-us/library/bb387098.aspx

+1

Bonne idée. Peut utiliser XPath si Linq-to-XML n'est pas souhaitable pour une raison quelconque. –

+0

Très bon point! XPath est assez similaire à Linq to XML, et XPath ne nécessite pas .NET 3.0 et versions ultérieures. –

3

Vous pouvez utiliser plusieurs XmlElements avec une propriété:

[XmlElement("NUMBER")] 
[XmlElement("REGION")] 
[XmlElement("MENTION")] 
[XmlElement("FEDERAL")] 
public List<Column> Columns {get;set;} 

Il est même possible de spécifier différentes classes pour les différents noms de balises :

[XmlElement(ElementName = "One", Type = typeof(OneItem))] 
[XmlElement(ElementName = "Two", Type = typeof(TwoItem))] 
public List<BaseItem> Items {get;set;} 
Questions connexes