2009-01-30 7 views
5

J'essaie de sérialiser une classe personnalisée qui doit utiliser plusieurs éléments du même nom.
J'ai essayé d'utiliser xmlarray, mais il les enveloppe dans d'autres éléments.XmlSerialization Collection as Array

Je veux que mon xml ressemble à ceci.

<root> 
    <trees>some text</trees> 
    <trees>some more text</trees> 
</root> 

Mon code:

[Serializable(), XmlRoot("root")] 
public class test 
{ 
     [XmlArray("trees")] 
     public ArrayList MyProp1 = new ArrayList(); 

     public test() 
     { 
      MyProp1.Add("some text"); 
      MyProp1.Add("some more text"); 
     } 
} 
+0

avez-vous essayé de définir l'attribut XmlArrayItem (typeof (System.String)) avec le XMLArray? – Perpetualcoder

+0

oui, il crée quelque chose comme le XML ci-dessous texte texte plus

+0

Bonne question, mauvais titre. Titre devrait être "Comment aplatir un tableau/liste/collection avec XmlSerializer" –

Répondre

7

Essayez juste en utilisant [XmlElement("trees")]:

[Serializable(), XmlRoot("root")] 
public class test 
{ 
    [XmlElement("trees")] 
    public List<string> MyProp1 = new List<string>(); 

    public test() 
    { 
     MyProp1.Add("some text"); 
     MyProp1.Add("some more text"); 
    } 
} 

Remarque J'ai changé ArrayList-List<string> pour nettoyer la sortie; dans 1.1, StringCollection serait une autre option, bien que cela ait différentes règles de sensibilité à la casse.

+0

cela fonctionne parfaitement grâce –

+0

Merci! Exactement ce que je cherchais! –

0

(edit: obsoleted - mon second post ([XmlElement]) est la voie à suivre - je laisse cela pour la postérité en utilisant xsd.exe)

xsd.exe est ton ami. Copiez le xml que vous voulez dans un fichier(), puis utilisez:

xsd foo.xml 
xsd foo.xsd /classes 

Maintenant, lisez foo.cs; vous pouvez l'utiliser soit directement, soit juste pour l'inspiration.

(edit: sortie snipped - pas plus utile)