2008-11-26 7 views
2

Je suis en série à XML ma classe où l'une des propriétés a le type Liste < chaîne >.Comment renommer les éléments XML enfants utilisés dans une liste XML sérialisée <string>?

public class MyClass { 
    ... 
    public List<string> Properties { get; set; } 
    ... 
} 

XML créé par sérialisation cette classe ressemble à ceci:

<MyClass> 
    ... 
    <Properties> 
     <string>somethinghere</string> 
     <string>somethinghere</string> 
    </Properties> 
    ... 
</MyClass> 

et maintenant ma question. Comment puis-je changer ma classe pour atteindre XML comme ceci:

<MyClass> 
    ... 
    <Properties> 
     <Property>somethinghere</Property> 
     <Property>somethinghere</Property> 
    </Properties> 
    ... 
</MyClass> 

après la sérialisation. Merci pour toute aide!

Répondre

7

Essayez XmlArrayItemAttribute:

using System; 
using System.IO; 
using System.Xml.Serialization; 
using System.Collections.Generic; 

public class Program 
{ 
    [XmlArrayItem("Property")] 
    public List<string> Properties = new List<string>(); 

    public static void Main(string[] args) 
    { 
     Program program = new Program(); 
     program.Properties.Add("test1"); 
     program.Properties.Add("test2"); 
     program.Properties.Add("test3"); 

     XmlSerializer xser = new XmlSerializer(typeof(Program)); 
     xser.Serialize(new FileStream("test.xml", FileMode.Create), program); 
    } 
} 

test.xml:

<?xml version="1.0"?> 
<Program xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Properties> 
    <Property>test1</Property> 
    <Property>test2</Property> 
    <Property>test3</Property> 
    </Properties> 
</Program> 
+0

Très bien! Ça marche. Grand merci – GrZeCh

0

Ajouter [XmlElement("Property")] avant la déclaration de votre membre Propriétés.

+0

Quand j'ai utilisé [XmlElement ("Property")] avant ma propriété XML leafs a été généré sous le noeud MyClass (ils doivent être placés sous "Propriétés"). L'utilisation de [XmlArrayItem ("Property")] a résolu mon problème. Merci pour ton aide – GrZeCh

0

Si vous voulez faire dans un service WCF et toujours utiliser DataContractSerializer, vous pouvez simplement définir une nouvelle sous-classe de liste:

[CollectionDataContract(ItemName="Property")] 
public class PropertyList: List<string> 
{ 
    public PropertyList() { } 
    public PropertyList(IEnumerable<string> source) : base(source) { } 
} 

Ensuite, dans la classe que vous sérialisation, indiquez simplement le membre comme:

[DataMember] 
public PropertyList Properties; 
Questions connexes