我有以下 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 来说是一个相当尴尬的要求。执行以下任一操作都很容易
id
和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
元素,以任意顺序(使用重复选择
)
<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/