5

इस तरह एक XML मान लिया जाये कि शामिल हैं:deserialize तत्व मूल्य स्ट्रिंग के रूप में हालांकि यह मिश्रित सामग्री

<my:Root xmlns:my="http://foo/bar"> 
    <my:FieldBasic>content</my:FieldBasic> 
    <my:FieldComplex> 
     <html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml"> 
      <div><h1>content</h1></div> 
     </html> 
    </my:FieldComplex> 
<my:Root> 

और एक वर्ग की तरह:

[Serializable] 
[XmlType(AnonymousType = true, Namespace = "http://foo/bar")] 
[XmlRoot(ElementName = "Root", Namespace = "http://foo/bar", IsNullable = false)] 
public class MyRoot 
{ 
    public string FieldBasic { get; set; } 
    public string FieldComplex { get; set; } 
} 

मैं कैसे FieldComplex के भीतर एक स्ट्रिंग के लिए <my:FieldComplex> deserialize करते हैं? जब यह HTML को अंदर पाता है तो यह विफल हो जाता है।

<html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml"> 
    <div><h1>content</h1></div> 
</html> 

अगर मैं FieldComplex रूप public object FieldComplex (अर्थात xsd:anyType) घोषित यह थोड़े से काम करता है और मैं एक XMLNode[] जो अंदर मैं उपयोग कर सकते हैं मिल: मैं यह मुझे इस सामग्री के साथ एक स्ट्रिंग दे बनाना चाहते हैं। के रूप में वस्तु <my:FieldComplex> पर इन विशेषताओं से जोड़ दिया जाएगा

<my:Root xmlns:my="http://foo/bar"> 
    <my:FieldBasic>content</my:FieldBasic> 
    <my:FieldComplex>content</my:FieldComplex> 
<my:Root> 

FieldComplex घोषणा:

लेकिन मैं FieldComplex जरूरत क्रमबद्धता एक्सएमएल एचटीएमएल शामिल नहीं होंगे के लिए के रूप में क्रमांकन के लिए प्रकार स्ट्रिंग की हो सकता है, यह तरह होगा तत्व:

xmlns:q1="http://www.w3.org/2001/XMLSchema" p3:type="q1:string" xmlns:p3="http://www.w3.org/2001/XMLSchema-instance 

और मुझे यह नहीं चाहिए। मैं serialization और deserialization के लिए विभिन्न वर्गों का उपयोग नहीं करना चाहता।

तो, क्या यह संभव है?

बनाने के एक लंबे कहानी कम, यह इस वर्ग के लिए संभव है:

public class MyRoot 
{ 
    public string FieldBasic { get; set; } 
    public string FielComplex { get; set; } 
} 

को क्रमानुसार यह करने के लिए:

<my:Root xmlns:my="http://foo/bar"> 
    <my:FieldBasic>content</my:FieldBasic> 
    <my:FieldComplex>content</my:FieldComplex> 
<my:Root> 

और इस से deserialize:

<my:Root xmlns:my="http://foo/bar"> 
    <my:FieldBasic>content</my:FieldBasic> 
    <my:FieldComplex> 
     <html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml"> 
      <div><h1>content</h1></div> 
     </html> 
    </my:FieldComplex> 
<my:Root> 

?

पीएस बस "क्यों?" समझाओ। मेरे पास एक वर्ग चुड़ैल धारावाहिक हो जाता है। धारावाहिक एक्सएमएल तब आवेदन में कई नोड्स के माध्यम से यात्रा करता है और अंत में वापस आता है लेकिन ऊपर की तरह बदल जाता है। परतें कुछ एक्सएमएल सत्यापन करते हैं और इनपुट पर अतिरिक्त गुण या तत्व होने से सत्यापन विफल हो जाता है और प्रवाह बंद हो जाता है। मैं रिटर्न एक्सएमएल को उसी कक्षा में मैप करना चाहता हूं। सामग्री केवल देखने का यह बिंदु से तार है लेकिन निश्चित रूप क्रमबद्धता/अक्रमांकन :(

उत्तर

3

यह पूरी तरह से समाप्त नहीं हुआ है क्योंकि अगर आप एक्सएमएल सीरियलाइजेशन में रूट तत्व में नेमस्पेस उपसर्ग को जोड़/कैसे जोड़ सकते हैं तो मुझे याद नहीं है।लेकिन अगर आप इस तरह अपने MyRoot कक्षा में IXmlSerializable इंटरफ़ेस को लागू:

 void IXmlSerializable.ReadXml(System.Xml.XmlReader reader) 
     { 
      reader.MoveToContent(); 
      var outerXml = reader.ReadOuterXml(); 
      XElement root = XElement.Parse(outerXml); 

      this.FieldBasic = root.Elements(XName.Get("FieldBasic", "http://foo/bar")).First().Value; 
      this.FieldComplex = root.Elements(XName.Get("FieldComplex", "http://foo/bar")).First().Elements().First().Value.Trim(); 
     } 



     void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer) 
     { 
      writer.WriteRaw(String.Format("\r\n\t<my:FieldBasic>\r\n\t\t{0}\r\n\t</my:FieldBasic>", this.FieldBasic)); 
      writer.WriteRaw(String.Format("\r\n\t<my:FieldComplex>\r\n\t\t{0}\r\n\t</my:FieldComplex>\r\n", this.FieldComplex)); 
     } 

(GetSchema विधि से अशक्त लौटें)

:

[XmlRoot("Root", Namespace="http://foo/bar")] 
public class MyRoot : IXmlSerializable 

फिर खुद के एक्सएमएल क्रमबद्धता तरीकों, कुछ इस तरह लिखने

यह आपको कम से कम उस चीज़ के करीब ले जाना चाहिए जो आप बाद में कर रहे हैं।

आप इन लिंक को भी उपयोगी पाते हैं।

IXmlSerializable

Namespaces

+0

इस समाधान के लिए बहुत बहुत धन्यवाद :)। यही वह है जिसकी तलाश में मैं हूं। – Beniamin

3

आप XML में CDATA इस्तेमाल कर सकते हैं कि सामग्री से संकेत मिलता है के लिए एक ही नहीं की एक स्ट्रिंग शाब्दिक है:

<my:Root xmlns:my="http://foo/bar"> 
    <my:FieldBasic>content</my:FieldBasic> 
    <my:FieldComplex> 
    <![CDATA[ 
     <html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml"> 
     <div><h1>content</h1></div> 
     </html> 
    ]]> 
    </my:FieldComplex> 
</my:Root> 
+1

दुर्भाग्य से मैं केवल क्या प्रवाह में हो जाता है पर नियंत्रण है, क्या बाहर हो जाता है नहीं। मैं नहीं जोड़ सकता। – JohnDoDo