xml - 如果 DTD DOCTYPE 存在,Xerces 强制元素声明
问题描述
我有以下 XML 文档:
<!DOCTYPE root [<!ENTITY foo "bar">]>
<root>
<child>&foo;</child>
</root>
我想根据以下 XSD 架构对其进行验证:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="child" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
为此,我使用了一个小的 ANT 脚本:
<project basedir="." name="schema-validation-test" default="test">
<target name="test">
<schemavalidate failonerror="true" file="src.xml" nonamespacefile="schema.xsd">
</schemavalidate>
</target>
</project>
虽然 XML 结构对 XSD 有效,但我得到了错误:
[schemavalidate] ...\src.xml:2:7: Elementtyp "root" muss deklariert werden.
[schemavalidate] ...\src.xml:3:12: Elementtyp "child" muss deklariert werden.
(原文,翻译意思是'Element type "root" must be declared'
:)
我想我知道会发生什么:Xerces 找到 DTD 声明并尝试根据它验证 XML。我需要关闭 DTD 验证(不关闭完整验证)或指定没有声明的元素或属性不会产生错误。我玩了很多 Xerces 功能 ( https://xerces.apache.org/xerces-j/features.html ),但没有找到令人满意的设置。
感谢您的帮助或提示!
版本信息:
- 爪哇:1.8.0_211
- 蚂蚁:1.9.13
- Xerces:不确定,怎么查?
更新:找到我的 Xerces 版本:Xerces-J 2.7.1(对于 ant,执行<java classname="com.sun.org.apache.xerces.internal.impl.Version"/>
:)
注意:我在这里使用 Ant,但如果您有 Java 解决方案,它也可能会有所帮助。
解决方案
我认为您需要设置“schemaLanguage”属性。像这样的东西:
<project basedir="." name="schema-validation-test" default="test">
<target name="test">
<schemavalidate file="src.xml" noNamespaceFile="schema.xsd" failonerror="true">
<property name="http://java.sun.com/xml/jaxp/properties/schemaLanguage" value="http://www.w3.org/2001/XMLSchema"/>
</schemavalidate>
</target>
</project>
最好的问候, 屋大维
推荐阅读
- javascript - Get domain from range using ScaleBand
- regex - 如何在 nginx 中用“#”符号重写路径
- google-oauth - OpenIdDict - 禁用 XHR 请求的“连接/授权”重定向
- html - HTML 代码中的错误
- python - 如果python中的时间到了,如何跳到下一个输入
- ssh - 如何在 VBscript 中使用 SSH
- c# - 错误:将 MySQL 数据源添加到 Visual Studio 项目时“表 'mysql.proc' 不存在”
- tfs - 在哪里可以找到 TFS 2017 中的部署组选项卡?
- python - 如何在 Pandas 数据框的多列上运行 Ta-Lib?
- r - 用于检查 R 中日期格式的字符串模式匹配