2010-12-07 8 views
5

Iは次のように定義されたスキーマを持っている:C番号:タイプおよび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ではを使用し、私はシリアル化の間に使用されるクラスを生成します。上記のスキーマによって生成された クラスはシリアライズ次のXMLを生成します。このXMLは、SOAPリクエストで使用され、もう一方の端のサービスは、次のXMLを期待

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

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

方法をシリアル化されたxmlにxsi:type属性が含まれるようにスキーマを編集できますか?

答えて

5

派生型とXmlInclude属性を使用します。これは、この出力を生成し実行

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); 
} 

:たとえば

<?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> 

あなたがSOAPリクエストを使用しているので、私はシリアル化が暗黙のうちに起こることを意味する、ASMXを想定しています。あなたは本のコレクションを保持しているものに[XmlInclude]を適用する必要があります。これは、例えば、ウェブメソッドのパラメータとすることができる。

XSDおよびWSDLから開始して、XSDで型を定義すると、C#コードで示した継承関係を使用して、適切なXmlInclude属性を自動的に生成できます。

WSDLでは、要求メッセージは、BookのコレクションであるBooksタイプを取る場合があります。それとは別に、Bookから派生したもので、それを拡張しないMyBookTypeを定義します。

関連する問題