2010-02-23 39 views
3

我想通過現有的XML格式描述(即文檔 - 元素多樣性和類型的文檔 - 形式描述)來編寫XML模式。我最後的想法是將這樣的XSD提供給代碼生成器並獲得綁定類。如何使用屬性值作爲XML多態類型選擇的鑑別器?

下面是一個例子,我不能應付:

packet1.xml:

<?xml version="1.0" ?> 
<packet kind="type1"> 
    <field1>value1</field1> 
    <field2>value2</field2> 
</packet> 

packet2.xml:

<?xml version="1.0" ?> 
<packet kind="type2"> 
    <field1>value3</field1> 
    <field3>value4</field3> 
</packet> 

因此,而不是元素名稱,類型是在限定的屬性值。 類型1類型2唯一地定義了數據包的類型,即類型定義了嵌套字段的集合和類型。

我的想法是在XML和XML Schema草圖使用多態類型是這樣的:

schema.xsd:

<?xml version="1.0"?> 
<xsd:schema> 
    <xsd:complexType name="protocol_abstract" abstract="true"/> 
    <xsd:element name="protocol" type="protocol_abstract"/> 

    <xsd:complexType name="protocol_type1"/> 
     <xsd:complexContent> 
      <xsd:extension base="protocol_abstract"/> 
       <xsd:sequence> 
        <xsd:element name="field1" type="xsd:string"/> 
        <xsd:element name="field2" type="xsd:string"/> 
       </xsd:sequence> 
       <xsd:attribute name="kind" type="xsd:NMTOKEN" fixed="type1"/> 
      </xsd:extension> 
     </xsd:complexContent> 
    </xsd:complexType> 

    <xsd:complexType name="protocol_type2"/> 
     <xsd:complexContent> 
      <xsd:extension base="protocol_abstract"/> 
       <xsd:sequence> 
        <xsd:element name="field1" type="xsd:string"/> 
        <xsd:element name="field3" type="xsd:string"/> 
       </xsd:sequence> 
       <xsd:attribute name="kind" type="xsd:NMTOKEN" fixed="type2"/> 
      </xsd:extension> 
     </xsd:complexContent> 
    </xsd:complexType> 
</xsd:schema> 

這幾乎是卓有成效的,但需要XSI:型號規格:

packet21.xml:

<?xml version="1.0" ?> 
<packet kind="type1" xsi:kind="packet_type1"> 
    <field1>value1</field1> 
    <field2>value2</field2> 
</packet> 

packet22.xml:

<?xml version="1.0" ?> 
<packet kind="type2" xsi:kind="packet_type2"> 
    <field1>value3</field1> 
    <field3>value4</field3> 
</packet> 

用這樣的定義,驗證器確認XML是正確的。但是,這不是很方便,傳入的消息不包含xsi:type。

是否可以擺脫xsi:type並僅使用我的 kind屬性? 除了預處理之外,還有其他的方法嗎? (將屬性值轉換爲元素名稱)

感謝您提前提出任何想法。

回答

3

編號xsi:type是唯一的方法來做到這一點。除此之外,XML模式不支持條件驗證。

如果您需要進一步驗證這些約束,您需要對它們進行編碼或使用像Schematron這樣的東西。

相關問題