我想通過現有的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屬性? 除了預處理之外,還有其他的方法嗎? (將屬性值轉換爲元素名稱)
感謝您提前提出任何想法。