2011-11-24 18 views
16

मैं इस प्रकार एक कस्टम XML संरचना बनाना चाहते हैं।मैं सूची <Custom> कार्यान्वयन के लिए XmlArrayItem तत्व नाम कैसे सेट करूं?</p> <pre><code><Hotels> <Hotel /> </Hotels> </code></pre> <p>मैं <code>List</code> के एक कार्यान्वयन बना लेने के बाद यह करने के लिए सक्षम होने के लिए:

[XmlRootAttribute(ElementName="Hotels")] 
public class HotelList: List<HotelBasic> 

क्योंकि वर्ग कि सूची रखती है Hotel नाम नहीं है लेकिन HotelBasic मेरी एक्सएमएल

<Hotels> 
    <HotelBasic /> 
</Hotels> 

की तरह है मैं ISerializable या IEnumerable लागू करने के लिए बिना इसे ठीक कैसे करूँ: मेरे कोड इस प्रकार है?

+0

क्या आप धारावाहिक या deserialize चाहते हैं? – abatishchev

उत्तर

14

मान लिया जाये कि आप XmlSerializer उपयोग कर रहे हैं, अगर सब आप क्या करना चाहते बदल कैसे अपने HotelBasic वर्ग धारावाहिक है, तो आप XmlTypeAttribute उपयोग कर सकते हैं:

[XmlType(TypeName = "Hotel")] 
public class HotelBasic 
{ 
    public string Name { get; set; } 
} 
<Hotels xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Hotel> 
    <Name>One</Name> 
    </Hotel> 
    <Hotel> 
    <Name>Two</Name> 
    </Hotel> 
</Hotels> 
22
[XmlArray("Hotels")] 
[XmlArrayItem(typeof(Hotel), ElementName="Hotel")] 
public HotelList[] Messages { get; set; } 

चाहिए उत्पादन:

<Hotels> 
    <Hotel /> 
    <Hotel /> 
</Hotels> 

[XmlRoot("Hotels")] 
public class HotelList : IXmlSerializable 
{ 
    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     this.Hotels = XDocument.Load(reader) 
           .Select(h => new Hotel { Name = (string)h.Attribute("name") } 
           .ToList(); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     throw new NotSupportedException(); 
    } 
} 
+0

मुझे सूची का उपयोग करने की आवश्यकता है, न कि HotelBasic [] – Odys

+0

@odyodyodys: 1. XmlSerializer केवल सरणी का समर्थन करता है। 2. आपने 'IENumerable 'के लिए कहा, सरणी इसे लागू करती है। 3. आप 'सूची ' नहीं चाहते हैं क्योंकि यह एक व्यय कंटेनर है, लेकिन एक्सएमएल में सूची * अंतिम * है। 4. आप 'toList() 'को कॉल करने वाली सूची बना सकते हैं। – abatishchev

+0

मैं उपयोग कर रहा हूँ 'तरह List's तरीकों का पता लगाएं और बहुत अधिक। यह 'reimplement को List' – Odys

6

मुझे लगता है कि madd0 यहाँ आप के लिए सबसे आसान विकल्प से पता चलता है, लेकिन सिर्फ पूर्णता के लिए ... व्यक्तिगत रूप से मेरा सुझाव है "के रूप में सूची को क्रमानुसार नहीं है:जब आपके HotelList वर्ग के साथ इस्तेमाल किया यह रूप में धारावाहिक रूप दिया जाएगा रूट ऑब्जेक्ट "- विभिन्न कारणों से (इसमें शामिल हैं: मैंने देखा है कि उन गुणों को कम से कम प्लेटफ़ॉर्म पर काम नहीं किया गया है - हो सकता है कि सीएफ या एसएल हो, याद नहीं हो सकता)। इसके बजाय, मैं हमेशा एक कस्टम जड़ प्रकार का उपयोग की सलाह दें:

[XmlRoot("Hotels")] 
public class HotelResult // or something similar 
{ 
    [XmlElement("Hotel")] 
    public List<HotelBasic> Hotels { get { return hotel; } } 

    private readonly List<HotelBasic> hotels = new List<HotelBasic>(); 
} 

यह वही एक्सएमएल संरचना होगा, और अधिक लचीलापन (आप अन्य विशेषताओं/रूट के तत्वों को जोड़ सकते हैं) की अनुमति देता है, और List<T> बेक नहीं करता है में आपका प्रकार का मॉडल (विरासत पर encapsulation पसंद करते हैं, आदि)।

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