Java中的XML验证:processContents =“lax”似乎无法正常工作
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java中的XML验证:processContents =“lax”似乎无法正常工作,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2655字,纯文字阅读大概需要4分钟。
内容图文
![Java中的XML验证:processContents =“lax”似乎无法正常工作](/upload/InfoBanner/zyjiaocheng/826/e96ed99109634ad5a1c064525a3b584a.jpg)
我有一个XML Schema,其中包含许多
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
定义,即它允许插入其他命名空间的任意标记. processContents =“lax”表示解析器应该尝试验证这些标记,如果它具有相应的模式(1) (2).
对我来说,这意味着,如果我向解析器提供所有模式文档,并且其中一个辅助命名空间存在无效的XML标记,则需要报告错误.
但是,似乎Java XML验证程序忽略了这些错误.我已经验证了解析器具有执行验证所需的所有模式文档(如果我将XML模式更改为processContents =“strict”,它将按预期工作并使用辅助模式文档进行验证).似乎验证器的行为就像使用值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”时,验证程序无法找到“invalidTag”的架构,因此根据规范忽略它.
内容总结
以上是互联网集市为您收集整理的Java中的XML验证:processContents =“lax”似乎无法正常工作全部内容,希望文章能够帮你解决Java中的XML验证:processContents =“lax”似乎无法正常工作所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。