XSD - 如何描述一组无序的元素类型,其中第一个元素必须首先出现在序列中?

oge*_*gee 20 xml schema xsd

这是一个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)


Dir*_*ers 6

我认为您正在寻找“所有”元素,它允许无序列表。但是,您可以放入的元素有限制。见http://www.w3.org/2005/07/xml-schema-patterns.html#Collection

  • &lt;xs:choice maxOccurs="unbounded" minOccurs="1"&gt; 也描述了一个无序列表。 (4认同)

Jam*_*ily 5

很抱歉,您已经为这个问题苦苦苦干了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。