2013-01-09 17 views
13

deserializing नहीं कर रहे हैं सी # नेट 4 का उपयोग करना - एक्सएमएल नमूना (रियल नमूना 6 गुण होते हैं)deserializing एक्सएमएल फ़ाइल के गुण - विशेषताओं

<TestXML> 
    <TestElement attr1="MyAttr" attr2="1" DateAdded="">25</TestElement> 
</TestXML> 

मेरी कक्षा परिभाषा के लिए मैं निम्नलिखित है:

public class TestXML() { 
    public TestXML() {} 

    public int TestElement {get; set;} 
    [XmlAttribute] 
    public string attr1 {get; set;} 
    [XmlAttribute] 
    public string attr2 {get; set;} 
    [XmlIgnore] 
    public DateTime DateAdded {get; set;} 
    [XmlAttribute("DateAdded")] 
    public string dateadded { 
     get{ return (DateAdded == null ? "" : DateAdded.ToString();} 
     set{ if(!value.Equals("")) DateAdded = DateTime.Parse(value);} 
    } 
} 

अब कोड deserialize करने के लिए:

string xml = "<TestXML><TestElement attr1=\"MyAttr\" attr2=\"1\" DateAdded=\"\">26</TestElement></TestXML>" 
using (StringReader sr = new StringReader(xml)) { 
    XmlSerializer serializer = new XmlSerializer(typeof(TestXML)); 
    TestXML myxml = (TestXML)serializer.Deserialize(sr); 
} 

अब परिणाम हम मिलता है (वी.एस. में वस्तु को देखने):

myxml 
    attr1   | null 
    attr2   | null 
    TestElement | 25 

एक पूर्ण हानि पर क्यों विशेषताएँ deserialize नहीं होगा।

+1

'' केवल ** सार्वजनिक int टेस्ट एलिमेंट {get; set;} ' –

+0

को संदर्भित करता है इस प्रश्न का लक्ष्य xml को सही ढंग से स्वरूपित करने के लिए कोड प्राप्त करना है। –

उत्तर

23

आप दो स्तरों की जरूरत है कि ऐसा करने के लिए:

[XmlRoot("TestXML")] 
public class TestXml { 
    [XmlElement("TestElement")] 
    public TestElement TestElement { get; set; } 
} 

public class TestElement { 
    [XmlText] 
    public int Value {get;set;} 

    [XmlAttribute] 
    public string attr1 {get;set;} 

    [XmlAttribute] 
    public string attr2 {get;set;} 
} 

ध्यान दें कि > 26 < समस्याओं भी (सफेद स्थान) का कारण बन सकता है; आपको एक int की बजाय स्ट्रिंग होने की आवश्यकता हो सकती है।

+0

मूल्य के चारों ओर रिक्त स्थान को सही किया, इसे दो वर्गों में दोबारा सुधार दिया, हालांकि प्रथम श्रेणी में संदर्भ चर वापस आ गया है; –

+0

@pyTeaParty बस बदलें: 'सार्वजनिक टेस्ट एलिमेंट {get; set;}' to: 'public TestElement TestElement {get; set;}'। – Mir

+0

आह, तत्व नाम मिलान बारे में भूल गया, तो हाँ दो वर्ग मेरी बड़ा परीक्षण पर समाधान है कि मैं आपको धन्यवाद देता हूं है इतना @Eve –

2

आप TestElement पर विशेषताओं को परिभाषित कर रहे हैं, जबकि वे TestXML पर होना चाहिए। उदाहरण:

@"<TestXML attr1=""MyAttr"" attr2=""1""> 
     <TestElement>26</TestElement> 
    </TestXML>" 
+0

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

+0

@pyTeaParty एक्सएमएल सही वाक्य रचनात्मक है, लेकिन हम नहीं जानते कि क्या वह कोड को अनुकूलित करना चाहता था या समझने के लिए कि यह क्यों काम नहीं कर रहा था। मैंने सोचा कि यह इंगित करता है कि XML को अपने कोड के काम के लिए कैसे होना चाहिए उपयोगी होगा। – Mir

+0

धन्यवाद एक्सएमएल के साथ काम करने के लिए कोड प्राप्त करने की कोशिश कर रहा है जो मैं करने की कोशिश कर रहा हूं। –

0

मैं सिर्फ serializing/अपने वस्तु deserializing एक परीक्षण भाग गया और यह काम करने के लिए ठीक

टेस्ट लगता है:

TestXML obj = new TestXML{ attr1 = "Attrib1", attr2 = "Attrib2", DateAdded = DateTime.Now, TestElement = 44}; 

XmlSerializer serializer = new XmlSerializer(typeof(TestXML)); 
using (FileStream stream = new FileStream(@"C:\StackOverflow.xml", FileMode.OpenOrCreate)) 
{ 
    serializer.Serialize(stream, obj); 
} 

using (FileStream stream = new FileStream(@"C:\StackOverflow.xml", FileMode.Open)) 
{ 
    TestXML myxml = (TestXML)serializer.Deserialize(stream); 
} 

सभी विशेषताओं ठीक deserialized।

परिणाम:

enter image description here

Xml:

<?xml version="1.0"?> 
<TestXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" attr1="Attrib1" attr2="Attrib2" DateAdded="10/01/2013 9:46:23 a.m."> 
    <TestElement>44</TestElement> 
</TestXML> 
+0

करीब देख रहे हैं मैं देख रहा हूँ आप पहली वस्तु को क्रमानुसार। जाहिर है एक्सएमएल तो मेल नहीं खाता मेरी कक्षा परिभाषा गलत है। –

0

स्वीकार किए जाते हैं जवाब देने के लिए एक अतिरिक्त नोट के रूप में। सुनिश्चित करें कि XML तत्व एक शून्य = "true" इस तरह विशेषता शामिल नहीं है बनाओ:

<TestXML> 
    <TestElement attr1="MyAttr" attr2="1" DateAdded="" xsi:nil="true">25</TestElement> 
</TestXML> 

मेरे अनुभव से deserializer एक तत्व की विशेषताओं deserialize नहीं होंगे चिह्नित अशक्त (शून्य) के रूप में।

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