2010-11-19 7 views
2

Dans mon projet, le code hérité génère du code XML qui a la structure suivante:problème en C# Xml désérialisation

<Output> 
    <Template recordID=12> 
     <Employer type="String"> 
      <Value>Google</Value> 
      <Value>GigaSoft inc.</Value> 
     </Employer> 
     <Designation type="String"> 
      <Value>Google</Value> 
     </Designation> 
     <Duration type="String" /> 
    </Template> 
</Output> 

Je veux désérialiser ce xml en objet qui a les propriétés suivantes (J'utilise C#):

public class EmployerInfo 
{ 
    string[] _employerName; 
    string[] _designation; 
    string _duration; 
} 

J'ai essayé de désérialiser ci-dessus XML en utilisant les attributs suivants autour des membres (NOTE: J'ai simplifié le code Je sais que nous ne devrions pas faire des membres de données publiques Ce code est juste à des fins expérimentales..)

[XmlElement("Template")] 
public class EmployerInfo 
{ 
    [XmlElement("Employer")] 
    public string[] _employerName; 

    [XmlElement("Designation")] 
    public string[] _designation; 

    [XmlElement("Duration")] 
    public string _duration; 
} 

désérialiser, dans la classe principale, j'ai écrit:

XmlSerializer serial = new XmlSerializer(typeof(Output)); 
TextReader reader = new StreamReader(@"C:\sample_xml.xml"); 
EmployerInfo fooBar = (EmployerInfo)serial.Deserialize(reader); 
reader.Close(); 

Après l'exécution de code ci-dessus, tous les membres objet fooBar sont définies sur null (valeurs par défaut). Je pense que c'est parce que la structure XML ne correspond pas à la structure de la classe.

J'ai essayé de générer automatiquement la classe à l'aide de la commande xsd, mais elle a créé des classes séparées pour chacun des membres de données.

J'ai essayé de donner des noms d'élément comme XmlElement ("Employer.Value"), XmlElement ("Template.Employer.Value") mais cela n'a pas fonctionné non plus.

Quelqu'un peut-il suggérer un moyen d'adapter ce fichier XML dans une classe EmployerInfo?

Merci à l'avance

Répondre

1

Essayez:

using System.IO; 
using System.Xml.Serialization; 
[XmlType("Template")] 
public class EmployerInfo 
{ 
    [XmlArray("Employer"), XmlArrayItem("Value")] 
    public string[] _employerName; 

    [XmlArray("Designation"), XmlArrayItem("Value")] 
    public string[] _designation; 

    [XmlElement("Duration")] 
    public string _duration; 
} 
public class Output 
{ 
    public EmployerInfo Template { get; set; } 
} 
static class Program 
{ 
    static void Main() 
    { 
     XmlSerializer serial = new XmlSerializer(typeof(Output)); 
     using (var reader = new StringReader(@"<Output> 
    <Template recordID=""12""> 
     <Employer type=""String""> 
      <Value>Google</Value> 
      <Value>GigaSoft inc.</Value> 
     </Employer> 
     <Designation type=""String""> 
      <Value>Google</Value> 
     </Designation> 
     <Duration type=""String"" /> 
    </Template> 
</Output>")) 
     { 
      EmployerInfo fooBar = ((Output)serial.Deserialize(reader)).Template; 
     } 
    } 
} 

Notez également tat du type retour de méthode deserialize de XmlSerializer(typeof(Output)) va être un record Output.

+0

Avons-nous besoin de spécifier l'attribut XmlRoot() au-dessus de la ligne EmployerInfo de classe publique? – Shekhar

+0

@Shekhar - J'ai mis à jour l'exemple pour travailler pleinement –