2009-07-22 11 views
6

मैं एक बहुत ही विशेष अक्रमांकन की जरूरत है, नीचे दिए गए उदाहरण देखें:क्या .NET XmlSerializer वर्ग एक स्ट्रिंग के रूप में InnerXml deserialize कर सकते हैं?

कहते हैं कि मैं निम्नलिखित वर्ग है:

[Serializable]
public class Person {
public string Name { get; set; }
public string PersonXml { get; set; }
}

और निम्न XML

 
<Person> 
    <Name>John</Name> 
    <PersonXml><someXmlFragment>text</someXmlFragment></PersonXml> 
</Person> 

क्या मैं चाहता हूँ XmlSerializer वर्ग है < पर्सनलएक्स > तत्व की स्ट्रिंग के रूप में PersonXml प्रॉपर्टी के इनरएक्सएमएल को deserialize करने के लिए। मुझे आश्चर्य है कि यह किया जा सकता है या नहीं।

नोट: मैं जानता हूँ कि मैं अवैध एक्सएमएल वर्ण बचने <PersonXml> की सामग्री सांकेतिक शब्दों में बदलना कर सकते हैं, लेकिन मैं भीतरी एक्सएमएल अधिक मानव अनुकूल (& लीटर युक्त नहीं छोड़ने के लिए पसंद करेंगे, और अन्य संस्थाओं है कि केवल मेरी अंत cofuse होगा उपयोगकर्ता)

उत्तर

3

आप हमेशा IXmlSerializable लागू कर सकते हैं और XmlReader के माध्यम से जो कुछ भी आप चाहते हैं उसे करें।

+0

ठीक है, मैं इस तरह के पथ पर विचार नहीं किया की तरह मुझे लगता है। यह निश्चित रूप से मेरी समस्या का समाधान करेगा, हालांकि मैं कुछ सस्ता समाधान की उम्मीद कर रहा था :) धन्यवाद! –

+0

बीटीडब्ल्यू, आपको एक्सएमएल क्रमिकरण के लिए [सीरियलज़ेबल] की आवश्यकता नहीं है। [XmlElemenht ("name")] को भी छोड़ा जा सकता है, क्योंकि इस विशेष मामले में यह XMLSerializer के डिफ़ॉल्ट व्यवहार को नहीं बदलता है। –

1

तो, हालांकि तत्व में वास्तव में XML तत्व शामिल हैं, आप चाहते हैं कि .NET यह वास्तव में एक स्ट्रिंग है? मुझे नहीं लगता कि मानक क्रमिकरण के माध्यम से यह संभव है।

हालांकि, आप एक्सएमएल लोड कर सकते हैं, PersonXml को बदल सकते हैं और इसे ठीक से बच सकते हैं और फिर पर्सनलएक्स की सामग्री को नए बचने वाले डेटा के साथ प्रतिस्थापित कर सकते हैं। इसमें इसे deserializing से पहले एक्सएमएल मैन्युअल रूप से जोड़ना शामिल होगा, लेकिन फिर आप एक्सएमएल तत्वों को PersonXml के तहत रख सकते हैं।

+0

हाँ, लेकिन यह बहुत ज्यादा परेशानी और एक सुंदर बदसूरत समाधान :) –

0

XML का प्रतिनिधित्व करने के लिए XML का उपयोग क्यों नहीं करें? PersonXml के लिए बस XmlElement का उपयोग करें।

यह हमेशा एक बुरा विचार है कि एक्सएमएल स्ट्रिंग के समान ही है।

0

पोस्ट पुराना है, लेकिन जैसा कि मैं एक समाधान की तलाश में था और शायद मेरा जवाब किसी की मदद कर सकता है।

क्या

के बारे में
[XmlText] 
public string PersonXml { get; set; } 

यह आपकी समस्या का समाधान नहीं होगा, लेकिन शायद यह एक स्वीकार्य विकल्प हो सकता है।

मेरे मामले में PersonXml एक "अच्छा-से-तत्व" है जिसमें हमेशा एक्सएमएल नहीं होता है। [XmlText] PersonXml को शून्य होने पर कारण होता है जब PersonXml में Xml होता है। हालांकि जब PersonXml में कोई एक्सएमएल वाला टेक्स्ट होता है तो deserialization सही है।

मेरे मामले में [XmlText] के बिना पर्सनलएक्सएल में एक्सएमएल व्यक्तियों को सही ढंग से deserialized होने से पहले तत्वों का कारण बनता है लेकिन PersonXml के बाद तत्व गलत तरीके से deserialized हैं।

0

इसी तरह के समाधान की खोज करते समय मैंने इस जवाब पर स्टंप किया। IXmlSerializable का उपयोग नहीं करना चाहता था।

तो, यदि कोई भविष्य में इस समस्या को देख रहा है, तो संदर्भ के लिए, आप XmlAnyElement विशेषता का उपयोग xmlNode के रूप में आंतरिक xml को क्रमबद्ध करने के लिए कर सकते हैं। इसके बाद आप एक्सएमएलएनोड को प्रोसेस कर सकते हैं जैसे आप फिट देखते हैं, सीरियलाइजेशन को अलग से चलाते हैं या बस आवश्यकतानुसार एक्सएमएल का टेक्स्ट प्राप्त करते हैं।

इस उदाहरण के लिए:

public class Person 
{ 

    public string Name { get; set; } 

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

} 
+0

PersonXml में [XmlText] विशेषता जोड़ने के लायक भी है। इसमें नोड के बच्चे शामिल होंगे और टेक्स्ट नोड्स शामिल होंगे – user2346593

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