很抱歉,您已经为这个问题苦苦挣扎了 7 年,却没有任何答案。
我将通过重新审视您的假设来提供帮助。
通过将“名称”视为必须首先出现的一条数据,并要求它必须是 Application 的子项,然后一般说您不关心其兄弟姐妹的顺序,您正在制造一个令人困惑的情况为自己。如果 Name 遵循不同的规则并服务于不同的目的,为什么它是 ADD 和 DELETE 的兄弟?如果您必须在任何其他数据结构中对此进行建模,则不会在“添加”和“删除”旁边的事物列表中包含“名称”。你会说两件事:一个应用程序有一个名称,它还有一个命令列表,例如 ADD 和 DELETE。
由于与 ADD 和 DELETE 相比,Name 是一个特殊的东西,所以它应该与其他标签分开建模。
因此,您可以将 Name 设为 Application 的属性,并将 Add 和 Delete 保留为子元素,或者您可以将 Name 保留为子元素,然后用占位符/分组标记(例如 Commands)围绕 ADD 和 DELETE。Commands 标签将是 Name 的唯一兄弟。
这是一个支持 Name 作为属性的模式,具有任意数量的任意顺序的命令。“名称为 Attribute.xsd”:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Application" type="Application_Type" />
<xs:complexType name="Application_Type">
<xs:all>
<xs:element minOccurs="0" ref="ADD"/>
<xs:element minOccurs="0" ref="DELETE"/>
<xs:element minOccurs="0" ref="THIRD"/>
<xs:element minOccurs="0" ref="FOURTH"/>
</xs:all>
<xs:attribute name="Name"/>
</xs:complexType>
<xs:element name="ADD"/>
<xs:element name="DELETE"/>
<xs:element name="THIRD"/>
<xs:element name="FOURTH"/>
</xs:schema>
示例 XML:
<?xml version="1.0" encoding="UTF-8"?>
<Application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="text" xsi:noNamespaceSchemaLocation="Name as Attribute.xsd">
<THIRD>text</THIRD>
<ADD>text</ADD>
<FOURTH>text</FOURTH>
<DELETE>text</DELETE>
</Application>
这是一个嵌套在占位符标记中的命令。“命令分组.xsd”:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Application" type="Application_Type"/>
<xs:complexType name="Application_Type">
<xs:sequence>
<xs:element ref="Name"/>
<xs:element name="Commands" type="Commands_Type"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Commands_Type">
<xs:all>
<xs:element minOccurs="0" ref="ADD"/>
<xs:element minOccurs="0" ref="DELETE"/>
<xs:element minOccurs="0" ref="THIRD"/>
<xs:element minOccurs="0" ref="FOURTH"/>
</xs:all>
</xs:complexType>
<xs:element name="Name"/>
<xs:element name="ADD"/>
<xs:element name="DELETE"/>
<xs:element name="THIRD"/>
<xs:element name="FOURTH"/>
</xs:schema>
示例 XML:
<?xml version="1.0" encoding="UTF-8"?>
<Application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Commands Grouping.xsd">
<Name>text</Name>
<Commands>
<THIRD>text</THIRD>
<ADD>text</ADD>
<FOURTH>text</FOURTH>
<DELETE>text</DELETE>
</Commands>
</Application>
关于其中任何一个的一个注意事项是,带有零命令的消息仍然是有效消息。也许这没关系,但如果这是一个问题,那么验证可能属于应用程序层而不是 XSD。