我有以下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元素。
我该如何处理?
答案 0 :(得分:3)
这对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
元素,以任何顺序排列(使用重复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>