2009-09-06 8 views
5

ich eine XML-Datei haben etwas wie folgt aussehen:Implementierung IXmlSerializable auf einem Sammlungsobjekt

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

und ich habe eine zwei Objekte, die diese 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); 
    } 
} 

ich die XmlSerializer verwenden, um zu Serialisierung/Deserialisieren des XmlObject in Datei.

Das Problem ist, dass, wenn ich die benutzerdefinierten IXmlSerializable-Funktionen auf meinem "Unterobjekt" -Element implementiert habe ich immer nur ein Element (das erste) in meiner XmlObject.listitems-Auflistung beim Deserialisieren der Datei. Wenn ich das entfernen: IXmlSerializable funktioniert alles wie erwartet.

Was mache ich falsch?

Edit: Ich habe IXmlSerializable.GetSchema implementiert und ich muss IXmlSerializable auf meinem "Kind-Objekt" für einige benutzerdefinierte Wert Transformation verwenden.

Antwort

2

Ändern Sie den Code wie folgt aus:

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

Zuerst Überspringe den Anfang des Item-Knotens, lese die zwei Strings und lies dann den Endknoten, so dass der Leser an der richtigen Stelle ist. Dies liest alle Knoten im Array.

Sie müssen beachten, wenn Sie xml selbst ändern :)

+0

Vielen Dank. –

1

Sie müssen IXmlSerializable nicht verwenden. Aber wenn Sie möchten, sollten Sie GetShema() -Methode implementieren. Nach einigen Modifikation Code, das aussieht wie funktioniert: für 2 Einzelteile in itemlist aussehen wird, dass

[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 
} 

Ergebnisse:

<?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

Das hat nichts geändert. Aber danke fürs ausprobieren. –

Verwandte Themen