xml - XSD <xs :all> with multi occurrences unordered

标签 xml xsd xsd-validation

我有以下 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

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

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

但我需要有几个file_size(一个大小和一个单位)。

要恢复,props 的所有子项都可以按任意顺序排列,但具有任意数量的 file_size 元素。

我该如何处理这个问题?

最佳答案

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

  • idfile_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 元素,以任意顺序(使用重复选择)
<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>

关于xml - XSD <xs :all> with multi occurrences unordered,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24759628/

相关文章:

java - 将字符串从 xml 响应转换为 pdf

xsd - XSD 中的可选 key

用于 Excel XML 导出的 XML 模式

java - Xerces-J 对未解析的 xsi :type? 的宽松验证失败是否正确

xml - 如何在同一父标签下重用本地定义的元素

java - 如何使用 JAVA 将给定的分层 XML 文件转换为非规范化关系数据库表

PHP、MySQL - 加载大约 100k 记录并将其导出到 xml

xml - 如何验证 mule esb 中的架构?

c# - 如何通过 XElement 放置属性

c# - 通过导入将 XSD 转换为 XML