使用 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>