2009-09-04 6 views
2

J'essaye de charger plusieurs éléments du même nom de XML dans une classe en utilisant la désérialisation en C#. Tout dans mon exemple se charge bien mais les éléments de tableau (Element3) ne sont pas remplis.Charger plusieurs éléments XML dans un objet en utilisant la sérialisation en C#

code:

class Program 
{ 
    static void Main(string[] args) 
    { 
     FileStream file = new FileStream("service.xml", FileMode.Open); 

     if (file != null) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(Service)); 
      Service service = (Service)serializer.Deserialize(file); 
     } 
    } 
} 

public class Service 
{ 
    public bool Element1; 
    public string Element2; 
    public string[] Element3; 
} 

XML:

<Service> 
    <Element1>true</Element1> 
    <Element2>Text 1</Element2> 
    <Element3>Text 2</Element3> 
    <Element3>Text 3</Element3> 
</Service> 
+0

FYI, 'fichier' ne sera jamais nul. –

Répondre

4

Essayez de mettre [XmlElement] sur Element3.

+0

Cela a fonctionné! Merci! – Ryall

+0

@John: Wow si simple :). Je ne savais pas que c'était possible avec cet attribut. –

+0

Il vaut la peine de lire les documents sur les attributs, et même de créer de petits exemples pour vous de voir comment ils fonctionnent. Tôt ou tard, vous en aurez besoin. –

2

La raison pour laquelle votre tableau ne se charge pas est parce que, en ce qui concerne .NET sérialisation XML, vous n'êtes pas essayer de lire un tableau. Un tableau sera représenté quelque chose comme:

<Element3Array> 
    <ArrayElement>Text 2</ArrayElement> 
    <ArrayElement>Text 3</ArrayElement> 
</Element3Array> 

Vous devez soit modifier le format de la source XML ou créer un XML personnalisé sérialiseur pour votre classe pour faire face à votre situation.

2

Je pense que votre fichier XML est incorrect. Logiquement, un tableau est sérialisé comme ceci:

<Element3> 
    <string>Text 2</string> 
    <string>Text 3</string> 
</Element3> 

Ainsi, votre xml doit avoir ce format:

<Service> 
    <Element1>true</Element1> 
    <Element2>Text 1</Element2> 
    <Element3> 
     <string>Text 2</string> 
     <string>Text 3</string> 
    </Element3> 
</Service> 

Modifier: Ajout d'un exemple pour unserialize ce xml si vous ne pouvez pas changer le format. Le code ci-dessous n'est pas testé.

votre service de classe doit dérivé de IXmlSerializable:

public class Service : IXmlSerializable 
{ 
    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     List<string> element3 = new List<string>(); 

     while (reader.Read()) 
     { 
     if (reader.Name == "Element1" && reader.NodeType == XmlNodeType.Element) 
     { 
      Element1 = Convert.ToBoolean(reader.ReadString()); 
     } 
     else if (reader.Name == "Element2" && reader.NodeType == XmlNodeType.Element) 
     { 
      Element2 = reader.ReadString(); 
     } 
     if (reader.Name == "Element1" && reader.NodeType == XmlNodeType.Element) 
     { 
      element3.Add(reader.ReadString()); 
     } 
     } 

     Element3 = element3.ToArray(); 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteStartElement ("Service"); 

     writer.WriteStartElement ("Element1"); 
     writer.WriteString(Element1.ToString()); 
     writer.WriteEndElement(); 

     writer.WriteStartElement ("Element2"); 
     writer.WriteString(Element2.ToString()); 
     writer.WriteEndElement(); 

     foreach (string ele in Element3) 
     { 
     writer.WriteStartElement ("Element3"); 
     writer.WriteString(ele); 
     writer.WriteEndElement(); 
     } 

     writer.WriteEndElement(); 
    } 
} 
+0

Ce n'est pas mon XML - c'est juste ce que je dois travailler. – Ryall

+0

@Kelix: Eh bien, si vous ne pouvez pas recevoir un fichier XML correctement formaté pour votre classe, vous devrez créer un Sérialiseur Xml personnalisé comme suggéré par Justin. –

Questions connexes