2010-11-08 3 views
1

Je travaille avec un grand fichier xml contenant des collections illimitées. L'idée est d'utiliser XmlReader pour lire le fichier et désérialiser le XML interne dans un objet et faire un traitement ultérieur.Deserialize InnerXML à un objet dans .NET

La structure XML est quelque chose comme ceci:

<Basket xmlns="http://AppleFarm.com/Basket"> 
<AppleCount>10000</AppleCount> 
<Apples> 
    <Apple><ID>1</ID><Color>Red</Color></Apple> 
    <Apple><ID>2</ID><Color>Green</Color></Apple> 
    ... 
    <Apple><ID>10000</ID><Color>Green</Color></Apple> 
</Apples> 
</Basket> 

Tout se passe bien à l'aide d'emballage XMLReader autour XmlTextReader pour lire le fichier. Cependant, lorsque j'ai essayé de désérialiser une pomme individuelle dans un objet, elle lance InvaildOperationException.

Quelqu'un sait quel est le problème? Y a-t-il une meilleure façon de le faire?

Voici les fragments de code

//Deserialize code 
public object Deserialize(XmlDocument doc, Type type){ 
    using(XmlNodeReader reader - new XmlNodeReader(doc.DocumentElement)){ 
     XmlReaderSetting settings = new XmlReaderSettings(); 
     settings.ValidationType = ValidationType.None; 
     using(XmlReader xReader = XmlReader.Create(reader, settings)){ 
      XmlSerializer serializer = new XmlSerializer(type); 
      object obj = serializer.Deserialize(xReader); 
     } 
    } 
} 

public void GetApples(string filepath){ 
    XmlTextReader reader = new XmlTextReader(filepath); 
    while(reader.Read()){ 
     while(reader.NoteType == XmlNodeType.Element && 
      reader.Name == "Apple"){ 
      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(reader.ReadOuterXml()); 
      Apple a = (Apple)Deserialize(doc, typeof(Apple)); 

      //... 
     } 
    } 
} 
//Deserialize code end 

//Apple class 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.XmlSerialization.XmlTypeAttribute(Namespace="http://AppleFarm.com/Basket")] 
public partial class Apple{ 
    private string idField; 
    private string colorField; 

    public string Id{ 
     get{ return this.idField; } 
     set{ this.idField = value; } 
    } 

    public string Color{ 
     get { return this.colorField; } 
     set { this.colorField = value; } 
    } 
} 
//Apple class end 
+1

Pouvez-vous publier votre code pour la désérialisation et le code pour votre classe Apple? – Oded

+0

J'ai ajouté les codes et l'espace de noms pour le xml. – Blithe

+0

L'ID doit-il être ID? –

Répondre

1

XML désérialisation besoin première ligne à

<?xml version="1.0" encoding="utf-8"?> 

Si vous voulez convertir une partie de document XML vous vous opposez devrez ajouter cette ligne à sommet du XML partiel.

Plus vous avez besoin pour décorer la classe Apple avec XmlRootAttribute où ElementName sera 'Apple'

cet article décrit comment définir XmlRootAtrribute http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute.aspx

Espérons que cela aidera

Reagards.

+0

Ah Shoaib vous avez raison! C'est XmlRootAttribute que la classe Apple est manquante. Merci;) – Blithe

+0

Voici ce que j'ai ajouté: [System.XmlSerialization.XmlRootAttribute (Namespace = "http://AppleFarm.com/Basket")] – Blithe

Questions connexes