2010-12-07 12 views
5

मैं एक स्कीमा इस प्रकार परिभाषित किया गया है:सी # serializing xsi: प्रकार और XSD

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="Books" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xs:element name="Books" msdata:IsDataSet="true" msdata:Locale="en-US"> 
    <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:element name="Book" type="MyBookType"></xs:element> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="MyBookType"> 
    ... 
    </xs:complexType> 

</xs:schema> 

इस स्कीमा और xsd.exe का उपयोग करना, मैं वर्गों है कि क्रमांकन के दौरान इस्तेमाल किया जाएगा उत्पन्न करते हैं। श्रेणी से ऊपर स्कीमा द्वारा उत्पन्न निम्नलिखित एक्सएमएल जब धारावाहिक का उत्पादन:

<Books> 
    <Book> 
    ... 
    </Book> 
</Books> 

इस एक्सएमएल एक सोप अनुरोध में प्रयोग किया जाता है और दूसरे छोर पर सेवा निम्न एक्सएमएल उम्मीद:

<Books> 
    <Book xsi:type="MyBookType"> 
    ... 
    </Book> 
</Books> 

कैसे क्या मैं अपनी स्कीमा संपादित कर सकता हूं ताकि xsi: टाइप एट्रिब्यूट serialized xml में शामिल किया गया हो?

उत्तर

5

व्युत्पन्न प्रकार का उपयोग करें, और XmlInclude विशेषता। उदाहरण के लिए:

<?xml version="1.0" encoding="IBM437"?> 
<Books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Book xsi:type="MyBookType"> 
    <Title>The Art of War</Title> 
    <Author>Sun Tzu</Author> 
    </Book> 
    <Book xsi:type="MyBookType"> 
    <Title>Great Expectations</Title> 
    <Author>Charles Dickens</Author> 
    </Book> 
</Books> 

आप एक सोप अनुरोध का उपयोग कर रहे हैं, मैं ASMX, जिसका अर्थ है यह सोचते हैं रहा हूँ क्रमबद्धता परोक्ष होता है:

public class Book 
{ 
    public string Title; 
    public string Author; 
} 

public class MyBookType : Book { } 

[XmlInclude(typeof(MyBookType))] 
[XmlRoot("Books")] 
public class Books : List<Book> { } 

public void Run() 
{ 
    var b = new Books(); 
    b.Add(new MyBookType 
     { 
      Title = "The Art of War", 
      Author = "Sun Tzu" 
     }); 
    b.Add(new MyBookType 
     { 
      Title = "Great Expectations", 
      Author = "Charles Dickens" 
     }); 

    var s = new XmlSerializer(typeof(Books)); 
    s.Serialize(Console.Out, b); 
} 

चल रहा है इस इस उत्पादन पैदा करता है। किताबों के संग्रह को रखने के लिए आपको [XmlInclude] लागू करने की आवश्यकता होगी। यह वेबमाइड में पैरामीटर हो सकता है, उदाहरण के लिए।

यदि आप एक्सएसडी और डब्ल्यूएसडीएल से शुरू करते हैं, तो आप एक्सएसडी में टाइपों को परिभाषित करते हैं, यदि आप सी # कोड में दिखाए गए विरासत संबंधों के साथ स्वचालित रूप से उपयुक्त XmlInclude विशेषता उत्पन्न कर सकते हैं।

डब्ल्यूएसडीएल में, अनुरोध संदेश Books प्रकार ले सकता है, जो Book का संग्रह है। अलग-अलग, MyBookType को परिभाषित करें जो पुस्तक से निकला है लेकिन इसे विस्तारित नहीं करता है।

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