我有大量的XML文件,并且只有2种元素类型。但是,元素的层次结构每xml都在不断变化。是否可以创建具有2种元素类型的XSD,并且XML文档的所有元素都将针对此XSD进行验证?
E.g。
让我们说a
和b
是唯一可能的元素类型
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文档,这些文档定义了元素a
和b
的外观?
更新:为'b'节点添加了属性。
答案 0 :(得分:2)
以下XSD将允许a
和b
元素的任意组合:
<?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
必须出现在a
和b
上,请照常在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