我有以下简单的 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 规范的内容。我的理解是否正确:
- 这三种评估方法被称为“主要”,因此允许其他(任意)方法?
- 在(3)中,如果根元素没有匹配的XSD定义,则应使用宽松的评估。但似乎规范并没有将具有 namespace 前缀的元素排除在宽松的评估之外。那么如果上面示例中的元素被赋予 namespace 前缀,J2SE 在线 validator 就会失败?
- 宽松的有效性评估是否适用于上面示例中的根?根没有“上下文确定的声明”,不是吗?规范中的定义如下:
...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 规范确实定义了不止一种“验证模式”,并且不同的工具可以使用不同的选项。参见
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/