【问题标题】:Precise XSD validation rules精确的 XSD 验证规则
【发布时间】:2013-12-05 21:26:19
【问题描述】:

我有以下简单的 XSD 架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://test" elementFormDefault="qualified" attributeFormDefault="unqualified"
  xmlns:tns="http://test"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="AType">
        <xs:sequence>
            <xs:element name="info" type="xs:string" />
        </xs:sequence>
    </xs:complexType>
    <xs:element name="A" type="tns:AType"/>
</xs:schema>

以下简单的 XML 文档对于此架构是否有效?

<?xml version="1.0" encoding="UTF-8" ?>
<X xsi:type="AType"
  xmlns="http://test"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <info>text</info>
</X>

我在一个使用 JAXP 和默认 J2SE 1.7 解析器的在线验证器中进行了尝试,并且成功验证了 XML 文档 (http://www.utilities-online.info/xsdvalidation/)。 另一方面,xmllint 说

Schemas validity error : Element '{http://test}X': No matching global declaration
available for the validation root. test2.xml fails to validate

他们是否使用不同的验证模式? J2SE解析器使用的模式是否基于XSD规范?

问题修正:

Michael Kay 向我(下)指出了 XSD 规范中的特定位置。我试图破译 XSD 规范所说的内容。我是否理解正确:

  1. 这三种评估方法被称为“主要”,因此允许其他(任意)方法?
  2. 在 (3) 中,如果根元素没有匹配的 XSD 定义,则应使用松散评估。但似乎该规范并未从宽松的评估中排除具有命名空间前缀的元素。而如果上面示例中的元素被赋予了命名空间前缀,那么 J2SE 在线验证器会失败吗?
  3. 在我上面的示例中,宽松的有效性会话是否适用于根?根没有“上下文确定的声明”,是吗?规范中的定义如下:

    ...如果元素信息项的“上下文确定的声明”没有通过“验证”相对于“ur-type 定义”而被跳过,则元素信息项的模式有效性可能会宽松地评估。 .

总而言之,XSD 规范是否允许任何验证方法?如果是这样,那么 XML 文档是模式有效的意味着什么?

【问题讨论】:

  • Yaneeve:谢谢。您的参考只是表明各种解析器如何解释 XSD 验证存在很大差异。我天真地认为这个概念很清楚,并且由 XSD 规范定义。 :-(

标签: java xml validation xsd


【解决方案1】:

是的,XSD 规范确实定义了不止一种“验证模式”,并且不同的工具可以使用不同的选项。见

http://www.w3.org/TR/xmlschema-1/#validation_outcome

我希望默认值(如果您没有指定要验证的元素或类型名称)为 (3),这会将您带到此处的架构有效性评估(元素):

http://www.w3.org/TR/xmlschema-1/#cvc-assess-elt

这实质上是说必须有 (a) 与实例中最外层元素的名称匹配的全局元素声明,或 (b) 与其 xsi:type 属性匹配的全局类型定义。当然,该实例必须对该元素声明或类型有效。由于您的实例具有 xsi:type 属性,因此我希望它能够针对该类型进行验证。

【讨论】:

  • 我添加了我对您对我最初问题的回答的反应,而不是作为评论,因为它有点长并且需要格式化。
  • 理论上,任何提供模式验证 API(或工具)的人都应该通过引用 XSD 规范中定义的特定过程来准确描述它的作用;不必有精确的映射。可悲的是,在实践中,许多工具似乎是在假设验证文档的含义很明显的情况下记录下来的,而正如您所发现的,情况远非如此。
  • 我总结一下:XSD 规范对于 整个 XML 文档相对于 XSD 模式有效的含义含糊不清。验证过程可以遵循规范中的一些提示,但是解析器会任意进行文档验证。因此,一个解析器成功验证了文档,而另一个则拒绝了它。
  • 我想通过引用 XSD 规范中的两条语句来支持前面的总结:第 5 章“模式有效性不是二进制谓词”。 Ch.5.2 “由应用程序决定什么是成功(验证)结果。”
猜你喜欢
  • 1970-01-01
  • 2023-01-22
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 2014-02-25
  • 1970-01-01
相关资源
最近更新 更多