我想通过现有的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属性? 除了预处理之外,还有其他的方法吗? (将属性值转换为元素名称)
感谢您提前提出任何想法。