java - 精确的XSD验证规则

标签 java xml validation xsd

我有以下简单的 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 解析器的在线 validator 中进行了尝试,并且 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定义,则应使用宽松的评估。但似乎规范并没有将具有 namespace 前缀的元素排除在宽松的评估之外。那么如果上面示例中的元素被赋予 namespace 前缀,J2SE 在线 validator 就会失败?
  3. 宽松的有效性评估是否适用于上面示例中的根?根没有“上下文确定的声明”,不是吗?规范中的定义如下:

    ...an element information item's schema validity may be laxly assessed if its "context-determined declaration" is not skip by "validating" with respect to the "ur-type definition"...

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

最佳答案

是的,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 属性,因此我希望针对该类型对其进行验证。

关于java - 精确的XSD验证规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20120465/

相关文章:

java - 在 Spring Boot 应用程序中添加条件外部 PropertySource

c# - 找不到路径的一部分?

c# - 序列化时间太长

angular - 输入类型编号步骤验证 - 自定义表单验证

java - 什么时候需要在 swing 组件上调用 revalidate() 以使其刷新,什么时候不需要?

ruby-on-rails - 验证 belongs_to 关联

java - 为什么setLayout方法不能与JPanel的ArrayList一起使用

java - 使用 Eclipse 抽象语法树的运行时错误

java - 批量查询爬虫操作的模式

java - 通过Java转义大量字符以在XHTML网页上显示