2011-04-20 6 views
0

J'essaye de désérialiser certains fichiers XML en utilisant le xml et les classes suivants. Le problème que je rencontre est que les noms d'éléments xml ne correspondent pas aux noms que je voudrais utiliser pour mes classes. J'ai essayé d'utiliser XmlRoot pour spécifier un nom d'élément, mais je n'ai pas réussi à le faire fonctionner. Toute aide serait appréciée.Deserializing XML

<Results recordReturn="3" xmlns="http://www.zzz.com/"> <Result> <key>98937747-0596-42e6-aa5b-e180d35f649e</key> <code>AFGHANISTAN</code> <number>004</number> </Result> <Result> <key>100ab860-f2a5-48ed-911c-31753b79234f</key> <code>ALBANIA</code> <number>008</number> </Result> <Result> <key>67ecc235-d44a-41e0-b2a0-7a9c00e30a0e</key> <code>ALGERIA</code> <number>012</number> </Result>

[Serializable] 
[XmlRoot("Result", Namespace = "http://www.zzz.com/")]  
public class Country 
{ 
    public Country() 
    { } 

    public string key; 
    public string code; 
    public string number; 
} 

[Serializable] 
[XmlRoot(ElementName = "Results", Namespace = "http://www.zzz.com/")] 
public class Countries : System.Collections.CollectionBase 
{ 
    public Country this[int nIndex] 
    { 
     get { return (Country)this.InnerList[nIndex]; } 
    } 

    public void Add(Country oCountry) 
    { 
     this.List.Add(oCountry); 
    } 
} 


//Code below is in separate class file 
    public static Countries GetAllCountries() 
    { 
     XmlNode countriesNode = //omitting code to get country xml 
     Countries countryList = new Countries(); 
     XmlSerializer serializer = new XmlSerializer(typeof(Countries)); 
     System.Xml.XmlNodeReader oReader = new System.Xml.XmlNodeReader(countriesNode); 
     countryList = (Countries)serializer.Deserialize(oReader); 

     return countryList; 
    } 

Répondre

0

XmlSerializer a un constructeur qui accepte la balise racine à utiliser. Cela devrait aider. Je créerais toujours quelques exemples d'exemples de mes classes et les sérialiserais. De cette façon, il est très facile de comprendre comment affiner la sérialisation/désérialisation xml.

1

En supposant que vous avez fixé votre mise en forme et un XML valide:

<Results recordReturn="3" xmlns="http://www.zzz.com/"> 
    <Result> 
    <key>98937747-0596-42e6-aa5b-e180d35f649e</key> 
    <code>AFGHANISTAN</code> 
    <number>004</number> 
    </Result> 
    <Result> 
    <key>100ab860-f2a5-48ed-911c-31753b79234f</key> 
    <code>ALBANIA</code> 
    <number>008</number> 
    </Result> 
    <Result> 
    <key>67ecc235-d44a-41e0-b2a0-7a9c00e30a0e</key> 
    <code>ALGERIA</code> 
    <number>012</number> 
    </Result> 
</Results> 

Ce qui suit devrait fonctionner parfaitement:

[XmlRoot("Result")] 
public class Country 
{ 
    [XmlElement("key")] 
    public string Key { get; set; } 
    [XmlElement("code")] 
    public string Code { get; set; } 
    [XmlElement("number")] 
    public string Number { get; set; } 
} 

public class Results 
{ 
    [XmlAttribute("recordReturn")] 
    public int RecordReturn { get; set; } 

    [XmlElement("Result")] 
    public Country[] Countries { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     var serializer = new XmlSerializer(typeof(Results), "http://www.zzz.com/"); 
     using (var reader = XmlReader.Create("test.xml")) 
     { 
      var results = (Results)serializer.Deserialize(reader); 
      // TODO : exploit the results 
     } 
    } 
} 
0

En plus d'essayer de déduire les attributs manuellement, une caractéristique moins connue du SDK .Net est que xsd.exe peut faire le travail pour vous. Dans une invite de commande .Net, tapez simplement:

xsd.exe <name of your schema>.xsd /classes 

Il créera les classes de sérialisation correctes pour ce schéma. Si vous n'avez pas de schéma, vous pouvez laisser xsd.exe en générer un pour vous. Passez simplement un exemple de fichier xml comme celui que vous avez fourni en argument, et il produira le fichier xsd correspondant.

Les classes générées sont partielles, vous pouvez donc les étendre sans avoir à réappliquer toutes vos modifications si vous les régénérez. En dehors de "/ classes", il existe d'autres commutateurs qui pourraient être utiles, comme "/ ebd", qui produit des classes qui implémentent INotifyPropertyChanged, ou "/ fields", qui génère des champs simples au lieu de propriétés.

0

[XmlRoot] est uniquement utilisé lorsque la classe est utilisée comme élément racine du document. Pour spécifier le nom de l'élément à utiliser en général, utilisez [XmlType].