2012-05-15 18 views
9

में बूल के लिए एक्सएमएल तत्व उपस्थिति को Deserialize मैं एक वेब सेवा से सी # POCOs में कुछ एक्सएमएल deserialize करने की कोशिश कर रहा हूँ। मुझे यह आवश्यक अधिकांश गुणों के लिए काम कर रहा है, हालांकि, मुझे एक बूल प्रॉपर्टी सेट करने की आवश्यकता है कि कोई तत्व मौजूद है या नहीं, लेकिन ऐसा नहीं लगता कि यह कैसे करें?सी #

एक उदाहरण एक्सएमएल टुकड़ा:

<someThing test="true"> 
    <someThingElse>1</someThingElse> 
    <target/> 
</someThing> 

एक उदाहरण सी # वर्ग:

[Serializable, XmlRoot("someThing")] 
public class Something 
{ 
    [XmlAttribute("test")] 
    public bool Test { get; set; } 

    [XmlElement("someThingElse")] 
    public int Else { get; set; } 

    /// <summary> 
    /// <c>true</c> if target element is present, 
    /// otherwise, <c>false</c>. 
    /// </summary> 
    [XmlElement("target")] 
    public bool Target { get; set; } 
} 

यह वास्तविक XML और वस्तु पदानुक्रम मैं प्रसंस्करण कर रहा हूँ की एक बहुत ही सरल उदाहरण है, लेकिन यह दर्शाता है कि मैं क्या मैं हासिल करने की कोशिश कर रहा हूँ।

deserializing शून्य/खाली तत्वों से संबंधित सभी अन्य प्रश्न Nullable<T> का उपयोग करने में शामिल हैं, जो मुझे चाहिए जो नहीं करता है।

क्या किसी के पास कोई विचार है?

उत्तर

12

ऐसा करने का एक तरीका तत्व के मूल्य को प्राप्त करने के लिए एक अलग संपत्ति का उपयोग करना होगा, फिर लक्ष्य तत्व का उपयोग यह प्राप्त करने के लिए करें कि वह तत्व मौजूद है या नहीं। इस तरह।

[XmlElement("target", IsNullable = true)] 
public string TempProperty { get; set; } 

[XmlIgnore] 
public bool Target 
{ 
    get 
    { 
     return this.TempProperty != null; 
    } 
} 

एक खाली तत्व मौजूद है के रूप में भले ही, TempProperty अशक्त नहीं होगा, इसलिए लक्ष्य true वापस आ जाएगी <target /> मौजूद

+0

धन्यवाद, इसे ओवरथिंक कर रहा था :) –

0

आप व्याख्या कर सकते हैं तुम क्यों व्यर्थ प्रकार का उपयोग करें चाहते है?
जब आप अपने पॉको में एक int (int के विपरीत int?) प्रॉपर्टी को परिभाषित करते हैं, तो यह वास्तव में अंतर्निहित xml का प्रतिनिधित्व नहीं करता है, और आपको बस उन चर के लिए डिफ़ॉल्ट मान मिलेंगे।
यदि u मान लें कि आपके अभ्यस्त उर एक्सएमएल में 0 मान खाली/बातिल तार या पूर्णांक प्राप्त, youcan विधि Balthy उर गुण से प्रत्येक के लिए सुझाव दिया है, या use the method described here


आम तौर पर मुझे लगता है कि इसके बारे में बेहतर जानकारी का इस्तेमाल किया अपने एक्सएमएल का वर्णन करने के लिए एक स्कीमा बनाने के लिए, और इसके आधार पर कक्षाएं उत्पन्न करें, जब आप वास्तव में चाहते हैं कि आपकी कक्षा अंतर्निहित डेटा का प्रतिनिधित्व करे।

+0

मैं Google खोज उपकरण से परिणाम deserializing कर रहा हूँ। परिणाम'परिणाम ' तत्व में मौजूद हैं यदि परिणाम स्वत: फ़िल्टर किए गए हैं, और यदि वे नहीं हैं तो मौजूद नहीं हैं। मुझे यह इंगित करने के लिए एक संपत्ति सेट करने की आवश्यकता है कि परिणाम सेट फ़िल्टर किया गया है या नहीं - मुझे नहीं लगता कि इस उदाहरण में एक नामुमकिन बूल कैसे मदद करेगा? –

+0

ऐसे मामले में उपयोग किए जाने वाले नलिकाएं संपत्ति के लिए हैं, न कि बूलियन जो कि खाली/शून्य या नहीं। यदि आप एफआई की सामग्री की परवाह नहीं करते हैं और केवल यह जांचना चाहते हैं कि वहां है या नहीं, तो balthys विधि नौकरी करेगी। अधिक उन्नत दृश्यों के लिए निरर्थक उचित उपयोगों का उपयोग किया जाना चाहिए, जब आप जिस मूल्य को जांचना चाहते हैं वह एक संख्या या कुछ और है जो क्लास यू का उपयोग करते हुए डिफ़ॉल्ट, गैर शून्य मान प्राप्त करेगा। यदि एक संख्यात्मक प्रकार था, पूर्णांक कहें, और आपने अपनी कक्षा में int FI का उपयोग किया है, तो उसके पास हमेशा 0 का मान होगा, जो शून्य के समान नहीं है। – YavgenyP

+0

धन्यवाद, मैं समझता हूं कि न्यूलबल के लिए क्या है। हालांकि, इस संदर्भ में, वे किसी भी गैर-मूल्य प्रकार का उपयोग करने से बेहतर नहीं होंगे, जो कि सरल नल चेक के साथ है जो बाल्थी सुझाव देता है। ' 'तत्व का मूल्य कभी नहीं होता - यह केवल उस तत्व की उपस्थिति है जो कुछ का प्रतिनिधित्व करता है। तो 'Nullable 'का मान हमेशा' डिफ़ॉल्ट (टी)' या शून्य होगा। –