2009-09-06 8 views
5

je un fichier XML à la recherche un peu comme ceci:La mise en œuvre IXmlSerializable sur un objet de collection

<xml> 
    <A>value</A> 
    <B>value</B> 
    <listitems> 
    <item> 
     <C>value</C> 
     <D>value</D> 
    </item> 
    </listitems> 
</xml> 

et moi avons deux objets représentant ce xml:

class XmlObject 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
    List<Item> listitems { get; set; } 
} 

class Item : IXmlSerializable 
{ 
    public string C { get; set; } 
    public string D { get; set; } 

    //Implemented IXmlSerializeable read/write 
    public void ReadXml(System.Xml.XmlReader reader) 
    { 
    this.C = reader.ReadElementString(); 
    this.D = reader.ReadElementString(); 
    } 
    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
    writer.WriteElementString("C", this.C); 
    writer.WriteElementString("D", this.D); 
    } 
} 

J'utilise le XmlSerializer pour sérialiser/désérialiser le XmlObject dans le fichier. Le problème est que lorsque j'ai implémenté les fonctions IXmlSerializable personnalisées sur mon article "sous-objet", je n'ai toujours qu'un seul élément (le premier) dans ma collection XmlObject.listitems lors de la désérialisation du fichier. Si je supprime le: IXmlSerializable tout fonctionne comme prévu.

Qu'est-ce que je fais de mal?

Edit: J'ai implémenté IXmlSerializable.GetSchema et j'ai besoin d'utiliser IXmlSerializable sur mon "child-object" pour faire une transformation de valeur personnalisée.

Répondre

2

Modifier votre code comme ceci:

public void ReadXml(System.Xml.XmlReader reader) 
    { 
     reader.Read(); 
     this.C = reader.ReadElementString(); 
     this.D = reader.ReadElementString(); 
     reader.Read(); 
    } 

D'abord, vous ignorez le début du noeud Item, lisez les deux chaînes, puis lisez le noeud final afin que le lecteur se trouve au bon endroit. Cela va lire tous les nœuds dans le tableau. Vous devez faire attention lorsque vous modifiez xml vous-même :)

+0

Merci beaucoup. –

1

Vous n'avez pas besoin d'utiliser IXmlSerializable. Mais si vous voulez, vous devez implémenter la méthode GetShema(). Après un certain code de modification qui fonctionne ressemble à ça:

[XmlRoot("XmlObject")] 
public class XmlObject 
{ 
    [XmlElement("A")] 
    public string A { get; set; } 
    [XmlElement("B")] 
    public string B { get; set; } 
    [XmlElement("listitems")] 
    public List<Item> listitems { get; set; } 
} 

public class Item : IXmlSerializable 
{ 
    [XmlElement("C")] 
    public string C { get; set; } 
    [XmlElement("D")] 
    public string D { get; set; } 

    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     throw new NotImplementedException(); 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     this.C = reader.ReadElementString(); 
     this.D = reader.ReadElementString(); 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteElementString("C", this.C); 
     writer.WriteElementString("D", this.D); 
    } 

    #endregion 
} 

Résultats pour 2 articles en Liste de produits ressembleront que:

<?xml version="1.0" encoding="utf-8"?> 
<XmlObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <A>value</A> 
    <B>value</B> 
    <listitems> 
    <C>value0</C> 
    <D>value0</D> 
    </listitems> 
    <listitems> 
    <C>value1</C> 
    <D>value1</D> 
    </listitems> 
</XmlObject> 
+0

Mais merci d'avoir essayé. –