XSD <xs:all>多次出现无序</xs:all>

时间:2014-07-15 13:32:50

标签: 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>

我的目标是允许无序元素,我看到所有指标solution

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

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

但我需要有几个 file_size (一个 size 和一个 unit )。

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

我该如何处理?

2 个答案:

答案 0 :(得分:3)

这对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元素,以任何顺序排列(使用重复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定义移到顶层,然后在{0}处出现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>

答案 1 :(得分:0)

您正在寻找合适的地方。您只需对架构进行一次小的更改:

<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:all>
                            <xs:element type="xs:int" name="size" />
                            <xs:element type="xs:string" name="unit" />
                        </xs:all>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>