XML Schema:当另一个元素存在时,要求元素存在

时间:2012-01-09 11:57:29

标签: xsd

我的架构允许特定元素是可选的,但是当我稍后在文件中遇到不同的可选元素时,我需要存在前一个元素。如何通过XSD确保这一点?

示例:

<settings>
  <file name="narf.txt"/>
  <metafile name="narf.meta"/>
  <filtermeta>true</filtermeta>
</settings>

应该有效,

<settings>
  <file name="narf.txt"/>
  <metafile name="narf.meta"/>
</settings>

<settings>
  <file name="narf.txt"/>
</settings>

也应该有效,

<settings>
  <file name="narf.txt"/>
  <filtermeta>true</filtermeta>
</settings>

不应该有效。

2 个答案:

答案 0 :(得分:3)

尝试以下架构定义:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="settings">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="file">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string"/>
          </xs:complexType>
        </xs:element>
        <xs:sequence minOccurs="0">
          <xs:element name="metafile">
            <xs:complexType>
              <xs:attribute name="name" type="xs:string"/>
            </xs:complexType>
          </xs:element>
          <xs:element minOccurs="0" name="filtermeta" type="xs:string"/>
        </xs:sequence>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

我使用xmllint对这个架构运行了前三个示例,并且它们正确验证。第四个例子失败了:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'filtermeta'. One of '{metafile}' is expected.

正如所料。

答案 1 :(得分:0)

您可以将filtermeta作为metafile元素的可选属性。