【问题标题】:XSD requiring a specific root element exist in an XML document?XSD 要求 XML 文档中存在特定的根元素?
【发布时间】:2019-07-27 13:59:41
【问题描述】:

我想验证一个 XML 文件并确保它有一个名为 speak 的根元素,如下所示:

<speak>
  <!--other node here...-->
</speak>

speak 元素必须存在于 XML 中并且只能出现一次。我尝试在我的 XSD 文件中添加以下代码:

<xsd:element name="speak" type="speak" minOccurs="1" maxOccurs="1"/>

但它不起作用。

【问题讨论】:

标签: xml xsd xsd-validation xml-validation


【解决方案1】:

在架构本身中,您不能对根元素必须是什么施加约束。 (这是设计使然,虽然不是每个人都认为这是一个好的设计。)任何全局元素声明都可以匹配根元素。

某些用于调用验证的 API 可能允许您约束根元素。例如,如果您使用 Saxon 模式验证器并从命令行运行它,则可以指定 -top:speak 以要求顶级元素命名为 speak

【讨论】:

  • 我认为您可能会回答比 OP 所问的更普遍的问题。通过对 XSD 设计的完全控制,可以在全局范围内只定义一个元素。然后,只有具有该根元素的 XML 文档才能使用 XSD 进行验证。如果没有对 XSD 的控制,如果存在多个全局元素定义,那么您是正确的,不能选择哪个必须是任何给定 XML 文档的根元素,as you've noted in the past
  • 写一个只有一个全局元素声明的模式对于最简单的文档模型来说是不可行的。
  • 复杂文档模型作者通常不会询问全局元素声明的出现约束。 ;-) 此外,使用Russian Doll or Venetian Blind patterns 的单个全局元素声明可以做很多事情。
【解决方案2】:

您可以在序列元素上使用 minOccurs/maxOccurs,如下所示:

 <xs:element name="speak">
     <xs:complexType>
         <xs:sequence minOccurs="1" maxOccurs="1">
             ...
         </xs:sequence>
     </xs:complexType>
 </xs:element>

但这不是必需的,因为它是一个多余的默认属性值分配。

【讨论】:

  • 这不是正确的方法。我想要的是让“说话”只出现一次。不是“speak”的子节点。
  • 哦,抱歉,这是不可能的。正如其他人所说,您不需要,因为xml是分层的,只要speak没有嵌套在另一个序列中,就没有必要定义约束。
【解决方案3】:

在根元素上不允许 XSD 出现约束,因为 XML 文档已经被约束为由单个根元素组成。因此,只需指定一个全局元素声明,并为 XML 中所需的根元素进行声明。无论如何,它实际上是minOccurs="1" maxOccurs="1"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多