gpt4 book ai didi

java - Java 中的 XML 验证 : processContents ="lax" seems not to work correctly

转载 作者:数据小太阳 更新时间:2023-10-29 01:56:11 26 4
gpt4 key购买 nike

我有一个 XML 模式,其中包含许多

<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />

定义,即它允许插入其他命名空间的任意标签。 processContents="lax" 表示解析器应该尝试验证这些标签,如果它有相应的架构 (1) (2) .

对我来说这意味着,如果我向解析器提供所有模式文档,并且其中一个辅助命名空间存在无效的 XML 标记,它需要报告错误。

但是,Java XML validator 似乎忽略了此类错误。我已验证解析器具有执行验证所需的所有架构文档(如果我将 XML 架构更改为 processContents="strict",它会按预期工作并使用辅助架构文档进行验证) .似乎 validator 的行为就像用值 skip 指定属性一样。

用于验证的 Java 代码:

/*
* xmlDokument is the file name of the XML document
* xsdSchema is an array with all schema documents
*/
public static void validate( String xmlDokument, Source[] xsdSchema ) throws SAXException, IOException {
SchemaFactory schemaFactory = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
Schema schema = schemaFactory.newSchema( xsdSchema );
Validator validator = schema.newValidator();
validator.setErrorHandler( new MyErrorHandler() );
validator.validate( new StreamSource(new File(xmlDokument)) );
}

最小示例:

主要模式:

<xs:schema
xmlns="baseNamespace"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="baseNamespace"
xmlns:tns="baseNamespace">

<!-- Define single tag "baseTag" -->
<xs:element name="baseTag">
<xs:complexType>
<xs:sequence>
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

二级模式:

<xs:schema
xmlns="secondaryNamespace"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="secondaryNamespace"
xmlns:tns="secondaryNamespace"
elementFormDefault="qualified"
attributeFormDefault="qualified">

<xs:element name="additionalTag"/>

</xs:schema>

我要验证的 XML 文档:

<baseTag
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="baseNamespace"
xmlns:secondary="secondaryNamespace"
xsi:schemaLocation="
baseNamespace base.xsd
secondaryNamespace secondary.xsd">

<secondary:additionalTag/>
<secondary:invalidTag/>
</baseTag>

使用上面的 Java 代码提供两个模式文档不会产生任何验证错误,只有当我将基本模式中的 lax 更改为 strict 时(我不不想)。这种情况下的错误信息是

cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'secondary:invalidTag'.

问题:

我是否误解了什么,这实际上是正确的行为吗?或者我对 processContents 的看法是否正确?

我的架构文档是否在做正确的事情?

我的 Java 代码是否正确?我如何更改它才能使其按预期运行?

最佳答案

根据规范:

“它将验证可以获取模式信息的元素和属性,但不会为无法获取任何模式信息的元素和属性发出错误信号。”

因此,当您使用 procesContents“lax”时, validator 无法找到“invalidTag”的架构,因此根据规范将其忽略。

关于java - Java 中的 XML 验证 : processContents ="lax" seems not to work correctly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7820774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com