2013-09-04 6 views
12

मैं एक एकल XElement इस तरह लग रही है कन्वर्ट ? (... कम से कम त्रुटि जाँच के बिना)एकल XElement आपत्ति उठाने

XElement element = //Your XElement 
var serializer = new XmlSerializer(typeof(ProductAttribute)); 
(ProductAttribute)serializer.Deserialize(element.CreateReader()) 

उत्तर

13

आप सही क्रमबद्धता अपने वर्ग और वर्ग के सदस्यों

[Serializable()] 
[XmlRoot(ElementName = "row")] 
public class ProductAttribute 
{ 
    [XmlAttribute("flag")] 
    public string Flag { get; set; } 
    [XmlAttribute("sect")] 
    public string Sect { get; set; } 
    [XmlAttribute("header")] 
    public string Header { get; set; } 
    [XmlAttribute("body")] 
    public string Body { get; set; } 
    [XmlAttribute("extrainfo")] 
    public string Extrainfo { get; set; } 
} 
+1

अब तक का सबसे अच्छा समाधान, अगर यह काम करेगा। लेकिन मुझे मिलता है: 'विशेषता सिस्टम.एक्सएमएल। सरलीकरण .XmlElementAttribute इस घोषणा प्रकार पर मान्य नहीं है। यह 'संपत्ति, फ़ील्ड, पैरामीटर, रिटर्न वैल्यू' घोषणाओं पर केवल – Numm3n

+1

@ Numm3n Oups पर मान्य है, XmlRoot को मेरा उत्तर संपादित करना चाहिए – jbl

5

आप की कोशिश की है

var res = new ProdicAttribute { 
    Flag = (string)element.Attribute("flag"), 
    Sect = (string)element.Attribute("sect"), 
    ... 
} 
+0

हाँ, मैंने कोशिश की है, लेकिन मुझे केवल यह मिलता है: ' अपेक्षित नहीं था। – Numm3n

+0

आपको उत्पाद एट्रिब्यूट क्लास पर सही क्रमबद्धता विशेषताएं डालनी चाहिए। प्रत्येक संपत्ति के लिए कक्षा और XmlAttribute के लिए XmlElement की तरह। – Alberto

+0

धन्यवाद। लेकिन मुझे कक्षा में '[XmlElement (" row ")]' रखने की अनुमति नहीं है। 'विशेषता प्रणाली.एक्सएमएल। सरलीकरण .XmlElementAttribute इस घोषणा प्रकार पर मान्य नहीं है। यह 'संपत्ति, फ़ील्ड, पैरामीटर, रिटर्न वैल्यू' घोषणाओं पर मान्य है ' – Numm3n

1

यह काफी आसान लगता है::

+0

यह मैन्युअल मैपिंग है। लेकिन क्या होगा यदि मेरे पास 200 गुणों के साथ XElement है? मैं उम्मीद कर रहा था कि सी #/नेट के पास एक आसान समाधान होगा – Numm3n

+0

एक्सएमएल सीरियलाइजेशन गुण प्राप्त करना सही नहीं है (और मुझे यह त्रुटि प्रवण लगता है) ... मैं इसे और अधिक काम के रूप में नहीं देखता हूं। इसके अलावा यह चिंताओं को अलग करने में मदद करता है :-)। – Richard

0
var element = XElement.Parse("<row flag="1" sect="" header="" body="" extrainfo="0" />"); 

var productAttribute = new ProductAttribute { 
    Flag = (string)element.Attribute("flag"), 
    Sect = (string)element.Attribute("sect"), 
    Header = (string)element.Attribute("header"), 
    Body = (string)element.Attribute("body"), 
    Extrainfo = (string)element.Attribute("extrainfo") 
}; 

लेकिन मैं सब ProductAttribute वर्ग गुण नहीं लगता कि string के रूप में टाइप किया जाना चाहिए।

3

मैं एक निर्माता है कि एक XElement में ले जाता है जोड़ना होगा पर जिम्मेदार बताते हैं डाल करने के लिए की है।

public class ProductAttribute 
{ 
    public string Flag { get; set; } 
    public string Sect { get; set; } 
    public string Header { get; set; } 
    public string Body { get; set; } 
    public string Extrainfo { get; set; } 

    public ProductAttribute(XElement xElement){ 
     Flag = (string)element.Attribute("flag"); 
     Sect = (string)element.Attribute("sect").Value; 
     Header = (string)element.Attribute("header ").Value; 
     Body = (string)element.Attribute("body").Value; 
     Extrainfo = (string)element.Attribute("extrainfo").Value; 
    } 
} 

तो फिर तुम सिर्फ आपको लगता है कि गतिशील आप प्रतिबिंब इस्तेमाल कर सकते हैं तो अधिक वर्ग तो पाश पर गुण प्राप्त करना चाहता था, तो कॉल कर सकते हैं

var productAttribute = new ProductAttribute(element); 

और उस विशेषता तो स्थापित करने के लिए है कि XElement खोज संपत्ति एक ही तरह से। हालांकि मैं इसे सरल रखूंगा क्योंकि ऑब्जेक्ट जटिल नहीं है।

7

आप इस तरह से कर सकता है:

1) सबसे पहले आप वर्ग के लिए गुण देना चाहिए:

[XmlRoot("row")] 
public class ProductAttribute 
{ 
    [XmlAttribute("flag")] 
    public string Flag { get; set; } 
    [XmlAttribute("sect")] 
    public string Sect { get; set; } 
    [XmlAttribute("header")] 
    public string Header { get; set; } 
    [XmlAttribute("body")] 
    public string Body { get; set; } 
    [XmlAttribute("extrainfo")] 
    public string Extrainfo { get; set; } 
} 

2) अब आप इस तरह अपने XElement या सरल एक्सएमएल स्ट्रिंग deserialize कर सकते हैं:

ProductAttribute productAttribute = new ProductAttribute(); 
XElement xElement = XElement.Parse(
"<row flag='1' sect='3' header='4444' body='3434' extrainfo='0' />"); 

//StringReader reader = new StringReader(
//"<row flag='1' sect='3' header='4444' body='3434' extrainfo='0' />"); 

StringReader reader = new StringReader(xElement.ToString()); 
XmlSerializer xmlSerializer = new XmlSerializer(typeof(ProductAttribute)); 
productAttribute = (ProductAttribute)xmlSerializer.Deserialize(reader); 

मुझे आशा है कि यह आपकी मदद करेगी।

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