2010-02-23 35 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这样的东西。

相关问题