2008-11-20 12 views
7

मैं एक XML संदेश को एक तत्व युक्त deserialize करना चाहता था जिसे nil="true" को int? प्रकार की संपत्ति वाले वर्ग में चिह्नित किया जा सकता है। काम करने के लिए एकमात्र तरीका यह था कि मैं अपना खुद का NullableInt प्रकार लिखूं जो IXmlSerializable लागू करता है। इसे करने का कोई बेहतर तरीका है?क्या XmlSerializer एक Nullable <int> में deserialize कर सकते हैं?

मैंने पूरी समस्या लिखी और जिस तरह से मैंने इसे हल किया on my blog

उत्तर

5

मुझे लगता है कि आपको XmlSerializer को शून्य करने के लिए deserialise करने के लिए नामस्थान के साथ nil = "true" उपसर्ग करना होगा।

MSDN on xsi:nil

<?xml version="1.0" encoding="UTF-8"?> 
<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="array"> 
    <entity> 
    <id xsi:type="integer">1</id> 
    <name>Foo</name> 
    <parent-id xsi:type="integer" xsi:nil="true"/> 
+0

धन्यवाद फिल, जिसने एक इलाज किया। अब मुझे सिर्फ उस व्यक्ति को नामस्थान जोड़ने के लिए संदेश प्रदान करने की आवश्यकता है ... –

+0

कोई चिंता नहीं SCOA :-P यदि आप स्रोत पर एक्सएमएल नहीं बदल सकते हैं (जैसा कि आप कर सकते हैं जैसे लगता है) तो आप इसे एक्सएसएलटी ट्रांसफॉर्म के माध्यम से पारित कर सकते हैं नामस्थान जोड़ने के लिए मुझे लगता है ... –

+0

हां जेएनपी, यह स्रोत पर ऐसा करना मुश्किल लगता है क्योंकि यह एक रेल ऐप है जो एक्सएमएल को 'to_xml' के साथ उत्पादित करता है। साथ ही, xsi जोड़ना: प्रकार विशेषता में .NET को 'array' नामक एक प्रकार की तलाश होती है, जो मौजूद नहीं है। तो अंत में मेरे 'NullableInt' प्रकार से चिपकना आसान हो जाएगा। –

3

मेरे ठीक पूर्व की प्रक्रिया के लिए नोड्स, किसी भी "शून्य" फिक्सिंग गुण है:

public static void FixNilAttributeName(this XmlNode @this) 
{ 
    XmlAttribute nilAttribute = @this.Attributes["nil"]; 
    if (nilAttribute == null) 
    { 
     return; 
    } 

    XmlAttribute newNil = @this.OwnerDocument.CreateAttribute("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance"); 
    newNil.Value = nilAttribute.Value; 
    @this.Attributes.Remove(nilAttribute); 
    @this.Attributes.Append(newNil); 
} 

मैं बच्चे नोड्स के लिए एक पुनरावर्ती खोज के साथ इस जोड़ी, ताकि के लिए किसी भी दिए गए XmlNode (या XmlDocument), मैं deserialization से पहले एक भी कॉल जारी कर सकते हैं। यदि आप मूल इन-मेमोरी स्ट्रक्चर को अनमोडिफाइड रखना चाहते हैं, तो एक्सएमएलएनोड के क्लोन() के साथ काम करें।

+0

यह मेरे लिए बहुत अच्छा काम करता है, धन्यवाद। और स्पष्ट रूप से रेल उपभोग के लिए। मैंने गैर-शून्य गुणों की जांच करने के लिए थोड़ा समायोजन किया: XmlAttribute nilAttribute = null; यदि (@ this.Attributes! = Null) { nilAttribute = @ this.Attributes ["nil"]; } – Dylan

0

ऐसा करने के लिए असाधारण आलसी तरीका। यह कई कारणों से नाजुक है लेकिन मेरा एक्सएमएल इतना तेज़ और गंदे फिक्स की गारंटी देने के लिए काफी आसान है।

xmlStr = Regex.Replace(xmlStr, "nil=\"true\"", "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\""); 
संबंधित मुद्दे