XSD允许两个元素的任意组合

时间:2015-04-08 11:00:15

标签: xml xsd xml-validation

我有大量的XML文件,并且只有2种元素类型。但是,元素的层次结构每xml都在不断变化。是否可以创建具有2种元素类型的XSD,并且XML文档的所有元素都将针对此XSD进行验证?

E.g。

让我们说ab是唯一可能的元素类型

1.XML

<b attr1="hello">
    <b attr1="Hello">
       <a></a>
       <a></a>
    </b>
    <a></a>
</b>

2.XML

<b attr1="hello">
    <b attr1="hello">
       <a></a>
       <a></a>
       <b attr1="hello">
           <a></a>
       </b>
    </b>
    <a></a>

</b>

我是否可以使用相同的XSD验证两个XML文档,这些文档定义了元素ab的外观?

更新:为'b'节点添加了属性。

1 个答案:

答案 0 :(得分:2)

以下XSD将允许ab元素的任意组合:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="a" type="ab"/>
  <xs:element name="b" type="ab"/>

  <xs:complexType name="ab">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="a"/>
      <xs:element ref="b"/>
    </xs:choice>
  </xs:complexType>
</xs:schema>

使用属性

根据原始问题的OP编辑更新:

  

更新:为'b'节点添加了属性。

要指定属性attr1必须出现在ab上,请照常在xs:attribute内添加xs:complexType声明:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="a" type="ab"/>
  <xs:element name="b" type="ab"/>

  <xs:complexType name="ab">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="a"/>
      <xs:element ref="b"/>
    </xs:choice>
    <xs:attribute name="attr1" use="required"/>
  </xs:complexType>
</xs:schema>

要指定某个属性attr1必须在b上显示而不需要a,请执行上述操作,但要拆分a和{{的定义1}}:

b