2009-06-29 11 views
9

मैं निम्नलिखित वर्ग को परिभाषित किया है डालने के लिए:मैं कैसे करूँ XmlSerializer का उपयोग एक xml स्ट्रिंग

public class Root 
{ 
    public string Name; 
    public string XmlString; 
} 

और एक वस्तु बनाया:

Root t = new Root 
     { Name = "Test", 
      XmlString = "<Foo>bar</Foo>" 
     }; 

जब मैं XmlSerializer वर्ग का उपयोग इस वस्तु को क्रमानुसार करने यह,

<Root> 
    <Name>Test</Name> 
    <XmlString>&lt;Foo&gt;bar&lt;/Foo&gt;</XmlString> 
</Root> 

मैं इसे अपने XmlString सामग्री सांकेतिक शब्दों में बदलना नहीं तो यह है कि मैं के रूप में धारावाहिक एक्सएमएल प्राप्त कर सकते हैं कैसे कर सकता हूँ: एक्सएमएल वापस आ जाएगी

<XmlString><Foo>bar</Foo></XmlString> 

धन्यवाद, इयान

उत्तर

1

मैं अगर यह संभव हो गया था बहुत आश्चर्य होगा। मान लीजिए कि यह आपके लिए करना संभव था - अगर आप संपत्ति में एक्सएमएल खराब कर चुके थे तो क्या होगा - सबकुछ टूट जाएगा।

मुझे उम्मीद है कि आपको या तो इस मामले के लिए अपना खुद का क्रमिकरण लिखना होगा, या इसे ऐसा करना होगा ताकि XmlString फ़ील्ड एक संरचना है जिसमें एक foo फ़ील्ड है।

2

आप (ab) IXmlSerializable interfaceXmlWriter.WriteRaw का उपयोग कर सकते हैं। लेकिन जैसा कि गैरेथम ने आपको बताया है, तो आपको अपने स्वयं के क्रमिकरण कोड को लिखना होगा।

using System; 
using System.Xml; 
using System.Xml.Schema; 
using System.Xml.Serialization; 

namespace ConsoleApplicationCSharp 
{ 
    public class Root : IXmlSerializable 
    { 
    public string Name; 
    public string XmlString; 

    public Root() { } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteElementString("Name", Name); 
     writer.WriteStartElement("XmlString"); 
     writer.WriteRaw(XmlString); 
     writer.WriteFullEndElement(); 
    } 

    public void ReadXml(System.Xml.XmlReader reader) { /* ... */ } 
    public XmlSchema GetSchema() { return (null); } 
    public static void Main(string[] args) 
    { 
     Root t = new Root 
     { 
     Name = "Test", 
     XmlString = "<Foo>bar</Foo>" 
     }; 
     System.Xml.Serialization.XmlSerializer x = new XmlSerializer(typeof(Root)); 
     x.Serialize(Console.Out, t); 
     return; 
    } 
    } 
} 

प्रिंट

<?xml version="1.0" encoding="ibm850"?> 
<Root> 
    <Name>Test</Name> 
    <XmlString><Foo>bar</Foo></XmlString> 
</Root> 
+0

क्या यह भी deserialize है? – configurator

+0

यदि आप रीडएक्सएमएल (एक्सएमएल रीडर रीडर) विधि को लागू करते हैं, तो हाँ। – VolkerK

1

इस प्रयास करें:

public class Root 
{ 
    public string Name; 
    public XDocument XmlString; 
} 

Root t = new Root 
     { Name = "Test", 
      XmlString = XDocument.Parse("<Foo>bar</Foo>") 
     }; 
13

आप कस्टम क्रमांकन सिर्फ तत्व कि इतने जैसे विशेष ध्यान देने की जरूरत के लिए सीमित कर सकते हैं।

public class Root 
{ 
    public string Name; 

    [XmlIgnore] 
    public string XmlString 
    { 
     get 
     { 
      if (SerializedXmlString == null) 
       return ""; 
      return SerializedXmlString.Value; 
     } 
     set 
     { 
      if (SerializedXmlString == null) 
       SerializedXmlString = new RawString(); 
      SerializedXmlString.Value = value; 
     } 
    } 

    [XmlElement("XmlString")] 
    [Browsable(false)] 
    [EditorBrowsable(EditorBrowsableState.Never)] 
    public RawString SerializedXmlString; 
} 

public class RawString : IXmlSerializable 
{ 
    public string Value { get; set; } 

    public XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     this.Value = reader.ReadInnerXml(); 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteRaw(this.Value); 
    } 
} 
+0

+1, मैं इसे अपने वर्ग रूट पर पसंद करूंगा: IXmlSerializable दृष्टिकोण। – VolkerK

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