2010-04-19 11 views
10

सी # में एक्सएमएल क्रमबद्धता का उपयोग करते समय, मैं अपने इनपुट एक्सएमएल के एक हिस्से को एक्सएमएलएनोड में deserialize करना चाहता हूं।एक तत्व को XmlNode के रूप में deserialize कैसे करें?

तो, यह एक्सएमएल दिया:

<Thing Name="George"> 
    <Document> 
    <subnode1/> 
    <subnode2/> 
    </Document> 
</Thing> 

मैं एक XmlNode के लिए दस्तावेज़ तत्व deserialize करना चाहते हैं।

नीचे मेरा एक्सएमएल दिया गया है जो एक्सएमएल को ऊपर दिया गया है, 'दस्तावेज़' तत्व के बजाय 'सबनोड 1' तत्व को दस्तावेज़ सेट करता है।

दस्तावेज़ तत्व को दस्तावेज़ तत्व में सेट करने के लिए कोड कैसे प्राप्त होगा?

using System; 
using System.IO; 
using System.Xml; 
using System.Xml.Serialization; 

[Serializable] 
public class Thing 
{ 
    [XmlAttribute] public string Name {get;set;} 
    public XmlNode Document { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
    const string xml = @" 
<Thing Name=""George""> 
    <Document> 
    <subnode1/> 
    <subnode2/> 
    </Document> 
</Thing>"; 
    var s = new XmlSerializer(typeof(Thing)); 
    var thing = s.Deserialize(new StringReader(xml)) as Thing; 
    } 
} 

हालांकि, जब मैं एक XmlSerializer का उपयोग बात का एक उदाहरण के लिए ऊपर एक्सएमएल deserialize करने के लिए, दस्तावेज़ संपत्ति चाइल्ड तत्व 'subnode1', बल्कि 'दस्तावेज़' तत्व से होता है।

मैं XmlSerializer को दस्तावेज़ 'दस्तावेज़' तत्व वाले XmlNode में सेट करने के लिए कैसे प्राप्त कर सकता हूं?

(एनबी: मैं प्रकार XmlElement [] की संपत्ति को निर्दिष्ट और यह [XmlAnyElement] चिह्नित करके दस्तावेज़ तत्व को प्राप्त कर सकते हैं, लेकिन वह नहीं बल्कि सिर्फ एक एक का नाम से सभी अपरिचित तत्वों की सरणी के लिए सेट है ' दस्तावेज़ ')

+0

हमम। यह एक गूढ़ व्यक्ति है! DataContractSerializer भी वही व्यवहार प्रदर्शित करता है। –

+0

संरचना हमेशा दस्तावेज़/सबनोड 1, दस्तावेज़/सबनोड 2 है, या उपनोड 3, सबनोड 4 इत्यादि होगा? यदि हां, तो क्या आप स्कीमा को दस्तावेज़/उपनोड में संशोधित करने के इच्छुक होंगे (subnode minOccurs = 0, maxOccurs = unbounded)? – code4life

+1

दस्तावेज़ की सामग्री पूरी तरह से मुक्त रूप है, यह दिखाने के लिए एक उदाहरण के रूप में है कि दस्तावेज का पहला बच्चा नोड deserializer द्वारा कैसे चुना जाता है। – mackenir

उत्तर

10

दस्तावेज़ संपत्ति को [XmlAnyElement] विशेषता के साथ चिह्नित करने का प्रयास करें।

[Serializable] 
public class Thing 
{ 
    [XmlAttribute] 
    public string Name {get;set;} 

    [XmlAnyElement] 
    public XmlNode Document { get; set; } 
} 

इस ताकि आप उन्हें बाहर फिल्टर करने के लिए की आवश्यकता होगी, कि में एक दुर्भाग्यपूर्ण दुष्परिणाम तुम सिर्फ subnode1 और subnode2 (सभी व्हाइटस्पेस भी deserialized हो ... ओह) की तुलना में अधिक मिलेगा होगा:

class Program 
{ 
    static void Main() 
    { 
     const string xml = @" 
<Thing Name=""George""> 
    <Document> 
    <subnode1/> 
    <subnode2/> 
    </Document> 
</Thing>"; 
     var s = new XmlSerializer(typeof(Thing)); 
     var thing = s.Deserialize(new StringReader(xml)) as Thing; 

     foreach (XmlNode node in thing.Document) 
     { 
      // should filter to only subnode1 and subnode2. 
      if (node.Name != "" && node.Name != "#whitespace") 
      { 
       Console.WriteLine(node.Name); 
      } 
     } 

     Console.ReadLine(); 
    } 
} 

आशा है कि इससे मदद मिलती है!

+0

मेरे प्रश्न के निचले भाग में मैंने उल्लेख किया कि XmlAnyElement विशेषता का उपयोग करना एक कामकाज था, लेकिन मुझे नहीं पता था कि इसे एक एक्सएमएलएनोड पर रखा जा सकता है। मैंने उस पाठ को जोड़ने से पहले शायद उत्तर दिया था। मैं हालांकि सभी अपरिचित तत्वों को कैप्चर करना पसंद करता हूं, इसलिए मैं एक्सएमएल में त्रुटियों का पता लगा सकता हूं (यानी केवल एक बच्चा तत्व होना चाहिए)। – mackenir

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