想要为XML文件编写模式

时间:2017-02-13 17:46:06

标签: xml xsd

我想编写验证以下xml

的模式
<labtest>
    <labtest_id1>10190</labtest_id1>
    <labtest_id2> 10200</labtest_id2>
    <labtest_id3> 10220</labtest_id3>
</labtest>

标签<labtest_id>的数量可能会增加或减少。我这样验证但它不起作用

    <xs:element name="labtest" minOccurs="1" maxOccurs="unbounded">
      <xs:complexType>
        <xs:sequence>
            <xs:element name="labtest_id" minOccurs="1" type="xs:decimal"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>

2 个答案:

答案 0 :(得分:3)

如果你想强制实施labtest的所有子节点必须命名为labtest_N的约束,其中N是一个整数,那就是你无法用XSD做的事情(除非使用带有断言的XSD 1.1)。

这是一种使用XML的糟糕方式,最好的办法是首先使用XSLT将其转换为理想的东西,例如:

<labtests>
  <labtest id='1'>10190</labtest>
  <labtest id='2'>10200</labtest>
  <labtest id='3'>10220</labtest>
</labtests>

然后使用XSD验证结果。

答案 1 :(得分:2)

按照Michael Kay的建议更改您的XML设计,并且仍然支持多个labtest元素以及多个labtest_id元素:

此XML,

<?xml version="1.0" encoding="UTF-8"?>
<labtests>
  <labtest>
    <labtest_id>10190</labtest_id>
    <labtest_id>10200</labtest_id>
    <labtest_id>10220</labtest_id>
  </labtest>
  <labtest>
    <labtest_id>12345</labtest_id>
  </labtest>
</labtests>

将成功验证此XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="labtests">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="labtest" minOccurs="1" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="labtest_id" minOccurs="1"
                          maxOccurs="unbounded" type="xs:decimal"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

备注:

  • 您希望重复labtest,但只能有一个根元素 在格式良好的XML中,所以添加一个labtests包装元素。
  • 您希望重复labtest_id,因此请添加maxOccurs="unbounded" 它的声明。