2012-10-16 21 views
22

में एक सरणी मैं एक XML दस्तावेज निम्न के समान है साथ XmlSerializer का उपयोग करना:मूल तत्व

<scan_details> 
    <object name="C:\Users\MyUser\Documents\Target1.doc"> 
     ... 
    </object> 
    <object name="C:\Users\MyUser\Documents\Target2.doc"> 
     ... 
    </object> 
    ... 
</scan_details> 

मैं System.Xml.Serialization एक्सएमएल अक्रमांकन सरल करने के लिए विशेषताओं का उपयोग करने की उम्मीद कर रहा हूँ। मेरे पास यह मुद्दा है कि मैं यह निर्दिष्ट नहीं कर सकता कि रूट नोड में एक सरणी है।

मैं निम्नलिखित वर्गों बनाने की कोशिश की है:

[XmlRoot("scan_details")] 
public class ScanDetails 
{ 
    [XmlArray("object")] 
    public ScanDetail[] Items { get; set; } 
} 

public class ScanDetail 
{ 
    [XmlAttribute("name")] 
    public string Filename { get; set; } 
} 

हालांकि जब मैं ScanDetails वस्तु में एक्सएमएल deserialize Items सरणी null बनी हुई है।

मैं रूट नोड में एक सरणी को कैसे deserialize कर सकते हैं?

उत्तर

41

आपको आइटम संपत्ति को सजाने के लिए [XmlElement] का उपयोग करना चाहिए, और [XmlArray] नहीं - यह पहले से ही एक सरणी है, और आप केवल तत्व का नाम सेट करना चाहते हैं।

public class StackOverflow_12924221 
{ 
    [XmlRoot("scan_details")] 
    public class ScanDetails 
    { 
     [XmlElement("object")] 
     public ScanDetail[] Items { get; set; } 
    } 

    public class ScanDetail 
    { 
     [XmlAttribute("name")] 
     public string Filename { get; set; } 
    } 

    const string XML = @"<scan_details> 
          <object name=""C:\Users\MyUser\Documents\Target1.doc""> 
          </object> 
          <object name=""C:\Users\MyUser\Documents\Target2.doc""> 
          </object> 
         </scan_details> "; 

    public static void Test() 
    { 
     XmlSerializer xs = new XmlSerializer(typeof(ScanDetails)); 
     MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(XML)); 
     var obj = xs.Deserialize(ms) as ScanDetails; 
     foreach (var sd in obj.Items) 
     { 
      Console.WriteLine(sd.Filename); 
     } 
    } 
} 
+0

आह ... यह भ्रमित शब्दावली का उपयोग करता है। मैं 'XmlArray' और 'XmlArrayItem' पर ध्यान केंद्रित कर रहा था। उसके लिए धन्यवाद! –

+1

यदि कोई सरणी है, लेकिन रूट स्तर के नीचे नहीं है, तो सरणी प्रॉपर्टी को अभी भी [XmlArray ("arrayElementName") की आवश्यकता होती है, और नहीं [XmlElement ("arrayElementItemName")], लेकिन यदि आपके उत्तर की तरह रूट स्तर के नीचे है इसकी आवश्यकता है [XmlElement ("arrayElementItemName")] क्या आप जानते हैं कि ऐसा क्यों है? यह रूट स्तर की तरह है जिसमें आप आंतरिक दोहराने वाले तत्व प्रकारों का वर्णन कर रहे हैं, और कहीं और सरणी प्रकार का वर्णन कर रहे हैं। – CRice

+0

मैं आपको धन्यवाद देने के लिए एक पल लेना चाहता हूं। मैंने कई सवालों पर कई उत्तरों के माध्यम से scoured और यह एकमात्र चीज है जो काम करता है। यह इतना अनजान है कि आपको मूल तत्व पर सरणी विशेषता को परिभाषित करने की आवश्यकता नहीं है, न ही सरणी तत्व। – Gaugeforever

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