【问题标题】:How can you make a sequence of optional items which must be in order in an XML schema?如何创建必须在 XML 模式中按顺序排列的可选项目序列?
【发布时间】:2010-05-27 20:02:52
【问题描述】:

我想要做的是在 XML 模式中创建一个序列元素,以便内容必须按顺序排列,但可能并非全部都存在。例如,架构将是这样的:

<xs:element name="rods" maxOccurs="1" minOccurs="1">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="green" type="xs:positiveInteger" />
   <xs:element name="white" type="xs:positiveInteger" />
   <xs:element name="blue" type="xs:positiveInteger" />
   <xs:element name="yellow" type="xs:positiveInteger" />
   <xs:element name="red" type="xs:positiveInteger" />
   <xs:element name="tan" type="xs:positiveInteger" />
   <xs:element name="gray" type="xs:positiveInteger" />
   <xs:element name="black" type="xs:positiveInteger" />
  </xs:sequence>
 </xs:complexType>
</xs:element>

并允许这样的 XML:

<rods>
 <green>142</green>
 <white>34</white>
 <gray>65</gray>
</rods>

MSDN 对此有这样的说法:

以下示例显示了一个元素 (zooAnimals),它可以在序列元素中包含零个或多个以下元素,大象、熊、长颈鹿。

<xs:element name="zooAnimals">
      <xs:complexType>
            <xs:sequence minOccurs="0" maxOccurs="unbounded">
               <xs:element name="elephant"/>
               <xs:element name="bear"/>
               <xs:element name="giraffe"/>
            </xs:sequence>
      </xs:complexType>
</xs:element>

W3Schools 也提出了同样的建议。 但是,Visual Studio 和在线验证服务都不喜欢所建议的内容。

这是我目前拥有的:

<xs:element name="rods" maxOccurs="1" minOccurs="1">
 <xs:complexType>
  <xs:sequence minOccurs="0" maxOccurs="1">
   <xs:element name="green" type="xs:positiveInteger" />
   <xs:element name="white" type="xs:positiveInteger" />
   <xs:element name="blue" type="xs:positiveInteger" />
   <xs:element name="yellow" type="xs:positiveInteger" />
   <xs:element name="red" type="xs:positiveInteger" />
   <xs:element name="tan" type="xs:positiveInteger" />
   <xs:element name="gray" type="xs:positiveInteger" />
   <xs:element name="black" type="xs:positiveInteger" />
  </xs:sequence>
 </xs:complexType>
</xs:element>

这是 XML:

<rods>
 <green>142</green>
 <white>34</white>
 <gray>65</gray>
</rods>

Visual Studio 2005 声称“灰色”是无效的,应该是“蓝色”,所以显然它想要所有的孩子

谢谢,

埃里克

【问题讨论】:

  • 您的架构定义对我来说看起来不错。愿意分享 Visual Studio 和在线验证器的结果/反馈吗?
  • 我已将结果添加到帖子中

标签: xml schema xsd sequence


【解决方案1】:
<xs:element name="rods">
    <xs:complexType>
        <xs:sequence>
                <xs:element minOccurs="0" name="green" type="xs:positiveInteger" />
                <xs:element minOccurs="0" name="white" type="xs:positiveInteger" />
                <xs:element minOccurs="0" name="blue" type="xs:positiveInteger" />
                <xs:element minOccurs="0" name="yellow" type="xs:positiveInteger" />
                <xs:element minOccurs="0" name="red" type="xs:positiveInteger" />
                <xs:element minOccurs="0" name="tan" type="xs:positiveInteger" />
                <xs:element minOccurs="0" name="gray" type="xs:positiveInteger" />
                <xs:element minOccurs="0" name="black" type="xs:positiveInteger" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

【讨论】:

  • 谢谢,这样就可以了。没有办法避免输入很多 minOccurs="0",是吗?我想知道为什么 W3Schools 和 MSDN 说其他代码有效,而实际上无效?
  • @Eric 它们都是序列,但在您想要的重要细节上有所不同。它们意味着该组的零次或多次重复,但您希望每个人都是零或一。你熟悉正则表达式吗? XML Schema 非常相似。他们的方法就像 (e g b)*,但你想要的是像 e? G?乙?
  • 啊...一定是误解了 MSDN 的意思
猜你喜欢
  • 2011-10-22
  • 2012-09-16
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-24
  • 2018-11-25
相关资源
最近更新 更多