是否可以创建一个模式,其中元素的子元素将序列中的部分元素而不是部分元素?像这样的东西:
<xs:element name="rootElement">
<xs:complexType>
<xs:all>
<xs:element name="value1" type="xs:string"/>
<xs:element name="value2" type="xs:string"/>
</xs:all>
<xs:sequence>
<xs:element name="value3" type="xs:string"/>
<xs:element name="value4" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
提前致谢!
答案 0 :(得分:0)
行。我想我知道你知道。您的XML看起来像:
<?xml version="1.0"?>
<house>
<ownerName>aaa</ownerName>
<ownerLastName>bbb</ownerLastName>
<rooms>
<room1>kitchen</room1>
<room2>living room</room2>
<room3></room3>
<room4></room4>
<room5></room5>
</rooms>
</house>
您希望ownerName
和ownerLastName
元素以任何顺序出现,尽管它们必须同时存在。从您的描述中不清楚rooms
元素的位置是否重要。我以为是。重要的是rooms
的子元素保持有序。
拆分,我们可以为房间定义complexType
(所以模型已经完成)
<xs:complexType name="RoomType">
<xs:simpleContent>
<xs:extension base="xs:string"/>
</xs:simpleContent>
</xs:complexType>
<xs:element name="RoomsType">
<xs:complexType>
<xs:sequence>
<xs:element name="room1" type="RoomType"/>
<xs:element name="room2" type="RoomType"/>
<xs:element name="room3" type="RoomType"/>
<xs:element name="room4" type="RoomType"/>
<xs:element name="room5" type="RoomType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
这为我们提供了顺序的房间序列。
使用xs:all
有很多限制,所以我在这里避免使用它(例如,你不能在序列中使用)。为了允许所有者名称以任何顺序出现,我使用了两个序列的选择。选择嵌入在另一个序列中,以确保rooms
元素最后一个。
<xs:complexType name="HouseType">
<xs:sequence>
<xs:choice>
<xs:sequence>
<xs:element ref="ownerName"/>
<xs:element ref="ownerLastName"/>
</xs:sequence>
<xs:sequence>
<xs:element ref="ownerLastName"/>
<xs:element ref="ownerName"/>
</xs:sequence>
</xs:choice>
<xs:element name="rooms" type="HouseType"/>
</xs:sequence>
</xs:complexType>
<xs:element name="house" type="HouseType"/>
现在,如果您实际上不关心订单或ownerLastName
,ownerName
和 house
,那么您可以使用xs:all
一个问题:
<xs:complexType name="HouseType">
<xs:all>
<xs:element ref="ownerName"/>
<xs:element ref="ownerLastName"/>
<xs:element name="rooms" type="HouseType"/>
</xs:all>
</xs:complexType>
要求您以任何顺序存在所有三个元素。