精确的XSD验证规则

时间:2013-11-21 12:00:20

标签: 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解析器的在线验证器中尝试了它,并且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定义,则应使用宽松评估。但似乎规范并没有从稀疏评估中排除具有名称空间前缀的元素。如果上面示例中的元素被赋予了名称空间前缀?
  3. ,那么J2SE online validatorn会失败
  4. 在我上面的示例中,lax有效性声明是否适用于root?根没有“上下文确定的声明”,有吗?规范中的定义为:

      

    ...元素信息项的模式有效性可能松散评估如果其“上下文确定的声明”没有通过“验证”关于“ur-type definition”跳过。

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

1 个答案:

答案 0 :(得分:0)

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