2009-09-06 12 views
5

मैं एक xml फ़ाइल इस तरह कुछ हद तक देख राशि पर IXmlSerializable को लागू:एक संग्रह वस्तु

<xml> 
    <A>value</A> 
    <B>value</B> 
    <listitems> 
    <item> 
     <C>value</C> 
     <D>value</D> 
    </item> 
    </listitems> 
</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); 
    } 
} 

मैं XmlSerializer का उपयोग क्रमानुसार करने/फाइल करने के लिए XmlObject deserialize।

समस्या यह है कि जब मैंने अपने "सब-ऑब्जेक्ट" आइटम पर कस्टम IXmlSerializable फ़ंक्शंस को लागू किया था, तो मुझे फ़ाइल को deserializing करते समय हमेशा मेरे XmlObject.listitems संग्रह में केवल एक आइटम (पहला) मिलता है। यदि मैं इसे हटा देता हूं: IXmlSerializable सब कुछ अपेक्षित के रूप में काम करता है।

मैं क्या गलत करता हूं?

संपादित करें: मैंने IXmlSerializable.GetSchema लागू किया है और मुझे कुछ कस्टम मूल्य परिवर्तन करने के लिए अपने "बच्चे-ऑब्जेक्ट" पर IXmlSerializable का उपयोग करने की आवश्यकता है।

उत्तर

2

इस तरह अपने कोड को संशोधित करें:

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

सबसे पहले आप आइटम नोड की शुरुआत छोड़ें, दो तारों को पढ़ें, फिर अंत नोड को पढ़ें ताकि पाठक सही जगह पर हो। यह सरणी में सभी नोड्स पढ़ेगा।

आपको स्वयं को xml संशोधित करते समय ध्यान देना होगा :)

+0

आपको बहुत बहुत धन्यवाद। –

1

आपको IXmlSerializable का उपयोग करने की आवश्यकता नहीं है। लेकिन अगर आप चाहते हैं कि आपको GetShema() विधि लागू करनी चाहिए। कुछ संशोधन कोड है कि काम करता है कि तरह लग रहा है के बाद:

itemlist में 2 आइटम के लिए
[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 
} 

परिणाम है कि तरह दिखेगा:

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

इससे कुछ भी नहीं बदला। लेकिन कोशिश करने के लिए धन्यवाद। –

संबंधित मुद्दे