xml - 我怎样才能从 xsd 序列中删除排序

标签 xml xsd xml-validation

如何删除以下 xsd 中的排序限制:

<xs:element name="example">
    <xs:sequence>
        <xs:element name="hostname" type="xs:string" minOccurs="0" maxOccurs="1"/>
        <xs:element name="filename" type="xs:string" minOccurs="1" maxOccurs="1"/>
        <xs:element name="chunks" type="xs:string" minOccurs="1" maxOccurs="unbonded"/>
    </xs:sequence>
</xs:element>

所以最后应该验证以下xml

<example>
    <chunks>...</chunks>
    <filename>...</filename>
    <chunks>...</chunks>
</example>
<!--  -->
<example>
    <filename>...</filename>
    <chunks>...</chunks>
    <chunks>...</chunks>
</example>
<!--  -->
<example>
    <filename>...</filename>
    <chunks>...</chunks>
    <chunks>...</chunks>
    <hostname>...</hostname>
</example>

接受的解决方案:

<xs:element name="example">
    <xs:all>
        <xs:element name="hostname" type="xs:string" minOccurs="0" maxOccurs="1"/>
        <xs:element name="filename" type="xs:string" minOccurs="1" maxOccurs="1"/>
        <xs:element name="chunks" type="xs:string" minOccurs="1" maxOccurs="unbonded"/>
    </xs:all>
</xs:element>

最佳答案

可以通过 sequence 的组合实现这一目标和 choice在几种可能的组合中重复元素,以确保存在所需的元素,但它不会那么好和简单。我会建议不同的设计(如果可能的话)。

你的<chunks>有什么原因吗?元素可以出现在任何地方?如果您正在设计 XML,决定哪些限制实际上是必要的,哪些应该灵活,将简化生成和处理(以及验证)。将它们按顺序排列或包装它们将使它们被视为 group并且将使验证更容易(它还会简化语言映射,例如,包装的相同元素经常被映射为数组)。

将相似元素放在一起的一种形式是 sequence ,你不想要的。另一种方法是将其包装在一个类型中并使用 xs:all :

<xs:element name="example">
  <xs:complexType>
    <xs:all>
      <xs:element name="filename" type="xs:string" minOccurs="1" maxOccurs="1"/>
      <xs:element name="hostname" type="xs:string" minOccurs="0" maxOccurs="1"/>
      <xs:element name="chunks" type="ChunksType" minOccurs="1" maxOccurs="1"/>
    </xs:all>
  </xs:complexType>
</xs:element>
<xs:complexType name="ChunksType">
  <xs:sequence>
    <xs:element name="chunk" minOccurs="1" maxOccurs="unbounded"/>
  </xs:sequence>
</xs:complexType>

这将验证这样的 XML 片段:

<example>
    <chunks>
        <chunk>...</chunk>
        <chunk>...</chunk>
    </chunks>
    <filename>...</filename>
</example>
<!--  -->
<example>
    <filename>...</filename>
    <chunks>
        <chunk>...</chunk>
        <chunk>...</chunk>
    </chunks>
</example>
<!--  -->
<example>
    <filename>...</filename>
    <chunks>
        <chunk>...</chunk>
    </chunks>
    <hostname>...</hostname>
</example>
<example>
    <hostname>...</hostname>
    <filename>...</filename>
    <chunks>
        <chunk>...</chunk>
        <chunk>...</chunk>
    </chunks>
</example>

失败的是:

<!-- missing filename -->
<example>
    <chunks>
        <chunk>...</chunk>
        <chunk>...</chunk>
    </chunks>
</example>

<!-- no chunks block -->
<example>
    <filename>...</filename>
    <hostname>...</hostname>
</example>

<!-- empty chunks block -->
<example>
    <hostname>...</hostname>
    <filename>...</filename>
    <chunks></chunks>
</example>

你不能只放置你的 unbounded xs:all 中的元素因为它只允许 01 .您不能使用一系列选择,因为您有必需的元素。你不能结合 xs:allsequence这将解决您的问题(实际上您可以做其中的一些事情,但如果您使用的是 XSD 1.1)。

XSD 1.1 中,您可以拥有 xs:allunbounded元素,以便您可以使用以下方法验证您的 XML:

<xs:all>
    <xs:element name="filename" type="xs:string" minOccurs="1" maxOccurs="1"/>
    <xs:element name="hostname" type="xs:string" minOccurs="0" maxOccurs="1"/>
    <xs:element name="chunks" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
</xs:all>

这在 XSD 1.0 中是非法的。

关于xml - 我怎样才能从 xsd 序列中删除排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23103526/

相关文章:

c# - 模式验证在验证之前不修剪字符串

Ruby - 读取和编辑 XML 文件

xml - 如何从 xml(包括标签)中提取完整的 html?

android - 如何通过显式创建 AndroidManifest.xml 来创建 android 应用程序?

intellij-idea - IDEA 似乎不了解 Servlet API 3.0 xml 模式,但是我的 web 应用程序部署正常吗?

xsd - IntelliSense 支持在 Visual Studio 中编辑 NuGet 规范

java xml验证soap-enc命名空间异常

使用 XSD : how to avoid caring about the sequence of the elements? 进行 XML 验证

java - GridView 项目的

XML 架构 - elementFormDefault 是不合格的,但使用了命名空间前缀