组参考取决于元素值

时间:2017-12-21 12:35:32

标签: xml xsd xsd-validation xml-validation

我想验证xml文件,以便根据元素的值,需要一组特定的元素。

例如,我有几种类型的标签打印机:CAB,Intermec等,应使用xml文件设置哪些配置。打印机可能只有很少的常用设置,但也应该具有特定于类型的设置。

这是我目前的简化xml架构(目前仅适用于2种类型):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="printer">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="type">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="CAB"/>
              <xs:enumeration value="Intermec"/>
            </xs:restriction>
          </xs:simpleType>
         </xs:element>
        <xs:element name="connected" type="xs:string"/>
        <xs:element name="id" type="xs:string"/>
        <xs:group ref="CabSettings" minOccurs="0"/>
        <xs:group ref="IntermecSettings" minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:group name="CabSettings">
    <xs:sequence>
      <xs:element name="portname" type="xs:string"/>
      <xs:element name="baudrate" type="xs:int"/>
      <xs:element name="parity" type="xs:string"/>
    </xs:sequence>
  </xs:group>
  <xs:group name="IntermecSettings">
    <xs:sequence>
      <xs:element name="ipaddress" type="xs:string"/>
      <xs:element name="port" type="xs:integer"/>
    </xs:sequence>
  </xs:group>
</xs:schema>

这是我已经停止的地方..我如何根据类型元素值要求期望类型特定组出现在xml中?甚至可以做这样的事情吗?可以使用XSD 1.0完成吗?

XML示例:

<printer>
    <type>CAB</type>
    <connected>true</connected>
    <id>CAB1</id>
    <portname>COM2</portname>
    <baudrate>57600</baudrate>
    <parity>NONE</parity>
</printer>

<printer>
    <type>Intermec</type>
    <connected>true</connected>
    <id>Intermec1</id>
    <ipaddress>127.0.0.1</ipaddress>
    <port>1</port>
</printer>

1 个答案:

答案 0 :(得分:1)

XSD 1.0

您必须根据元素名称区分类型。因此,您可以使用单独的printerCABPrinter元素,而不是单个IntermecPrinter元素。您可以像现在一样继续使用元素组来合并常用的定义组件。

XSD 1.1

您可以使用条件类型分配来根据属性的值区分printer的类型,或者您可以使用断言根据元素的值约束内容模型。