这是一个XML架构问题.
我知道xsd:all元素不能出现在序列中(必须是其类型的顶级元素).
也就是说,我不能使用以下内容:
<xsd:complexType name="Application">
<xsd:sequence>
<xsd:element ref="Name"></xsd:element>
<xsd:all>
<xsd:element ref="ADD"></xsd:element>
<xsd:element ref="DELETE"></xsd:element>
</xsd:all>
</xsd:sequence>
</xsd:complexType>
Run Code Online (Sandbox Code Playgroud)
我的问题是如何以任何顺序(无序集)声明上面的"ADD"和"DELETE"元素,但仍然确保元素"Name"将是第一个并始终显示.(想想我不仅有"ADD"和"DELETE"但大约有10个或更多无序元素设置的情况:ADD,DELETE,EDIT等......)
重要说明:ADD和DELETE可能仅出现在ONCE,但它们的顺序无关紧要:
<Application>
<NAME>
<DELETE>
<ADD>
</Application>
Run Code Online (Sandbox Code Playgroud)
但不是:
<Application>
<NAME>
<DELETE>
<ADD>
<DELETE> <!--cannot appear twice-->
</Application>
Run Code Online (Sandbox Code Playgroud)
Yos*_*han 17
如果我理解你的请求,你就是正确的,你唯一缺少的就是你选择的maxOccurs ="unbounded".
我创建了以下架构:
<?xml version="1.0"?>
<xs:schema targetNamespace="http://someNamespace" xmlns="http://someNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root" type="Application">
</xs:element>
<xs:complexType name="Application">
<xs:sequence>
<xs:element ref="Name"></xs:element>
<xs:choice maxOccurs="unbounded">
<xs:element ref="ADD"></xs:element>
<xs:element ref="DELETE"></xs:element>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:element name="Name"/>
<xs:element name="ADD"/>
<xs:element name="DELETE"/>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
它运作良好
<ns0:Root xmlns:ns0="http://someNamespace">
<ns0:Name />
<ns0:ADD />
<ns0:ADD />
<ns0:DELETE />
<ns0:ADD />
<ns0:DELETE />
<ns0:DELETE />
</ns0:Root>
Run Code Online (Sandbox Code Playgroud)
但不是
<ns0:Root xmlns:ns0="http://someNamespace">
<ns0:ADD />
<ns0:ADD />
<ns0:DELETE />
<ns0:ADD />
<ns0:DELETE />
<ns0:DELETE />
</ns0:Root>
Run Code Online (Sandbox Code Playgroud)
我认为您正在寻找“所有”元素,它允许无序列表。但是,您可以放入的元素有限制。见http://www.w3.org/2005/07/xml-schema-patterns.html#Collection
很抱歉,您已经为这个问题苦苦苦干了7年了,但没有答案。
我将通过重新考虑您的假设来提供帮助。
通过将“名称”视为必须首先出现的数据,并要求它必须是Application的子级,然后通常说您不关心其同级项的顺序,您就使情况变得混乱为自己。如果Name遵循不同的规则并具有不同的目的,为什么将它命名为ADD和DELETE的同级兄弟?如果必须在任何其他数据结构中对此建模,则不会在“ ADD”和“ DELETE”旁边的事物列表中包括“ Name”。您会说两件事:应用程序具有名称,并且还具有命令列表,例如ADD和DELETE。
由于Name与ADD和DELETE相比是特殊的事情,因此应与其他标签分开建模。
因此,您可以将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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
这是一个带有嵌套在占位符标签中的命令的命令。“命令Grouping.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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
关于这两个方面的一个注意事项是,带有零命令的消息仍然是有效消息。也许没关系,但是如果有问题,那么验证可能属于应用程序层而不是XSD。