XSD 多次出现且无序

2023-12-19

我有以下 XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<props>
<id>someId</id>
<file_size>
    <size>123</size>
    <unit>MB</unit>
</file_size>
<file_size>
    <size>123</size>
    <unit>MB</unit>
</file_size>
</props>

以及相应的XSD:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:element name="props">
    <xs:complexType>
        <xs:sequence>
            <xs:element type="xs:string" name="id" />
            <xs:element name="file_size" maxOccurs="unbounded" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element type="xs:int" name="size" />
                        <xs:element type="xs:string" name="unit" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

我的目标是允许无序元素,我看到ALL指标solution http://www.w3schools.com/schema/schema_complex_indicators.asp

但是,我如何保持 file_size 行为?我找到了一些解决方案:

<file_size>
    <size>123</size>
    <size>125</size>
    <unit>MB</unit>
    <unit>TB</unit>
</file_size>

但我需要有几个文件大小(与一个size和一个unit).

继续来说,props 的所有子项都可以按任意顺序排列,但具有任意数量的 file_size 元素。

我该如何处理这个问题?


这对于 XML Schema 1.0 来说是一个相当尴尬的要求。可以很容易地执行以下任一操作

  • 正好各有一个id and file_size,以任一顺序(使用all)
<xs:all>
    <xs:element type="xs:string" name="id" />
    <xs:element name="file_size">
        <xs:complexType>
            <xs:sequence>
                <xs:element type="xs:int" name="size" />
                <xs:element type="xs:string" name="unit" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:all>
  • 任意数量的id以及任意数量的file_size元素,以任何顺序(使用重复choice)
<xs:choice minOccurs="0" maxOccurs="unbounded">
    <xs:element type="xs:string" name="id" />
    <xs:element name="file_size">
        <xs:complexType>
            <xs:sequence>
                <xs:element type="xs:int" name="size" />
                <xs:element type="xs:string" name="unit" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:choice>

但为了满足您任意数量的特定要求file_size元素但是正好一个 id是比较笨拙的。我能想到的最清晰的方法就是移动file_size定义到顶层,然后ref在两个可能的地方出现零次或多次:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="unqualified" elementFormDefault="qualified">

<xs:element name="file_size">
    <xs:complexType>
        <xs:sequence>
            <xs:element type="xs:int" name="size" />
            <xs:element type="xs:string" name="unit" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="props">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="file_size" minOccurs="0" maxOccurs="unbounded" />
            <xs:element type="xs:string" name="id" />
            <xs:element ref="file_size" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
</xs:element>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XSD 多次出现且无序 的相关文章

随机推荐