使用 XSD 验证多个根
Using XSD to validate multiple roots
我正在做这个项目,我们只允许使用一个 XSD 文件来验证多个 XML 文件。
我有一个问题,我似乎无法弄清楚,也找不到类似的问题,如果这是一个重复的问题,我深表歉意。
假设我有一个 XML 文档,将其称为 currencies.xml
,其中包含以下 XML:
<index>
<currency>USD</currency>
<currency>EURO</currency>
</index>
其中必须至少包含 1 个 <currency\>
元素,但可以根据需要包含任意多个元素。
现在,假设我有多个其他 XML 文件,其名称与 currencies.xml
中的货币值相同,但为了简单起见,我们只使用包含以下内容的美元货币文件 USD.xml
:
<index>currency="USD">
<country short="USA">United States of America</country>
</index>
这次允许有 0 个 <country\>
个元素,也可以根据需要添加。
所以在我的验证 XSD 文件中,我有以下内容:
<xs:complexType name="root">
<xs:choice>
<xs:element name="currency" type="WithoutAttrib"/>
<xs:element name="country" type="WithAttrib"/>
</xs:choice>
<xs:attribute name="currency" type="rootAttribute" />
</xs:complexType>
<xs:complexType name="WithAttrib">
<xs:complexContent>
<xs:extension base="root">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="country" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="stringElement">
<xs:attribute name="short" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="WithoutAttrib">
<xs:complexContent>
<xs:extension base="root">
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="currency">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="30"></xs:maxLength>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="index" type="root"/>
stringElement
定义如下:
<xs:simpleType name="stringElement">
<xs:restriction base="xs:string"/>
</xs:simpleType>
到目前为止,这是我能想到的最好的解决方案,但它并没有像我需要的那样工作,有人可以通过向我提出的类似问题提供 link 来帮助我吗可以使用或者给我一些关于如何让它工作的建议。
我也不完全确定该属性是否应该在根目录中声明,如有任何相关建议,我们将不胜感激。
如果您需要有关特定内容的更多信息,请给我留言,我会进行编辑。提前致谢!
XML 中没有任何内容可以区分您需要的架构规则,因此您的 XSD 必须是 <index>
中所有有效属性和元素的超集。 XML 格式是固定的还是可以更改?
以下是您想要的,但是由于您在 index
元素中有属性,choice
不能将属性与 country
元素分组。
不太理想。
<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio 2021 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="index">
<xs:complexType>
<xs:choice>
<xs:element name="currency" type="currencyType" maxOccurs="unbounded" />
<xs:element name="country">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="short" type="currencyType" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:choice>
<xs:attribute name="currency" type="currencyType" />
</xs:complexType>
</xs:element>
<xs:simpleType name="currencyType">
<xs:restriction base="xs:string">
<xs:enumeration value="USD" />
<xs:enumeration value="GBP" />
<xs:enumeration value="EUR" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
我正在做这个项目,我们只允许使用一个 XSD 文件来验证多个 XML 文件。
我有一个问题,我似乎无法弄清楚,也找不到类似的问题,如果这是一个重复的问题,我深表歉意。
假设我有一个 XML 文档,将其称为 currencies.xml
,其中包含以下 XML:
<index>
<currency>USD</currency>
<currency>EURO</currency>
</index>
其中必须至少包含 1 个 <currency\>
元素,但可以根据需要包含任意多个元素。
现在,假设我有多个其他 XML 文件,其名称与 currencies.xml
中的货币值相同,但为了简单起见,我们只使用包含以下内容的美元货币文件 USD.xml
:
<index>currency="USD">
<country short="USA">United States of America</country>
</index>
这次允许有 0 个 <country\>
个元素,也可以根据需要添加。
所以在我的验证 XSD 文件中,我有以下内容:
<xs:complexType name="root">
<xs:choice>
<xs:element name="currency" type="WithoutAttrib"/>
<xs:element name="country" type="WithAttrib"/>
</xs:choice>
<xs:attribute name="currency" type="rootAttribute" />
</xs:complexType>
<xs:complexType name="WithAttrib">
<xs:complexContent>
<xs:extension base="root">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="country" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="stringElement">
<xs:attribute name="short" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="WithoutAttrib">
<xs:complexContent>
<xs:extension base="root">
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="currency">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="30"></xs:maxLength>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="index" type="root"/>
stringElement
定义如下:
<xs:simpleType name="stringElement">
<xs:restriction base="xs:string"/>
</xs:simpleType>
到目前为止,这是我能想到的最好的解决方案,但它并没有像我需要的那样工作,有人可以通过向我提出的类似问题提供 link 来帮助我吗可以使用或者给我一些关于如何让它工作的建议。
我也不完全确定该属性是否应该在根目录中声明,如有任何相关建议,我们将不胜感激。
如果您需要有关特定内容的更多信息,请给我留言,我会进行编辑。提前致谢!
XML 中没有任何内容可以区分您需要的架构规则,因此您的 XSD 必须是 <index>
中所有有效属性和元素的超集。 XML 格式是固定的还是可以更改?
以下是您想要的,但是由于您在 index
元素中有属性,choice
不能将属性与 country
元素分组。
不太理想。
<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio 2021 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="index">
<xs:complexType>
<xs:choice>
<xs:element name="currency" type="currencyType" maxOccurs="unbounded" />
<xs:element name="country">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="short" type="currencyType" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:choice>
<xs:attribute name="currency" type="currencyType" />
</xs:complexType>
</xs:element>
<xs:simpleType name="currencyType">
<xs:restriction base="xs:string">
<xs:enumeration value="USD" />
<xs:enumeration value="GBP" />
<xs:enumeration value="EUR" />
</xs:restriction>
</xs:simpleType>
</xs:schema>