从您问题中的 saxonica 链接:
当在命令行上使用 -catalog 选项时,这会覆盖
Saxon(从 9.4 开始)中使用的内部解析器用于重定向众所周知的
W3C 对 Saxon 本地副本的引用(例如 XHTML DTD)
这些资源。因为这两个功能都依赖于设置 XML
解析器的EntityResolver,不可能在
连词。
在我看来,这听起来像撒克逊人自动使用的本地副本著名的 W3C DTD,但如果您指定-catalog
,它不使用内部解析器,您必须在目录中明确指定这些解析器。
这是一个使用 Saxon 目录的工作示例......
我的示例的文件/目录结构
C:/so_test/lib
C:/so_test/lib/catalog.xml
C:/so_test/lib/resolver.jar
C:/so_test/lib/saxon9he.jar
C:/so_test/lib/test.dtd
C:/so_test/test.xml
XML DTD (so_test/lib/test.dtd
)
<!ELEMENT test (foo)>
<!ELEMENT foo (#PCDATA)>
XML实例 (so_test/test.xml
)
请注意,系统标识符指向一个不存在的位置,以确保目录正在被使用。
<!DOCTYPE test PUBLIC "-//TEST//Dan Test//EN" "dir_that_doesnt_exist/test.dtd">
<test>
<foo>Success!</foo>
</test>
XML目录 (so_test/lib/catalog.xml
)
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<group prefer="public" xml:base="file:///C:/so_test/lib">
<public publicId="-//TEST//Dan Test//EN" uri="lib/test.dtd"/>
</group>
</catalog>
命令行
请注意-dtd
启用验证的选项。
C:\so_test>java -cp lib/saxon9he.jar;lib/resolver.jar net.sf.saxon.Query -s:"test.xml" -qs:"<results>{data(/test/foo)}</results>" -catalog:"lib/catalog.xml" -dtd
Results
<results>Success!</results>
如果我使 XML 实例无效:
<!DOCTYPE test PUBLIC "-//TEST//Dan Test//EN" "dir_that_doesnt_exist/test.dtd">
<test>
<x/>
<foo>Success!</foo>
</test>
并运行与上面相同的命令行,结果如下:
Recoverable error on line 4 column 6 of test.xml:
SXXP0003: Error reported by XML parser: Element type "x" must be declared.
Recoverable error on line 6 column 8 of test.xml:
SXXP0003: Error reported by XML parser: The content of element type "test" must match "(foo)".
Query processing failed: The XML parser reported two validation errors
希望这个示例能帮助您弄清楚要更改设置的内容。
另外,使用-t
选项为您提供其他信息,例如加载的目录以及公共标识符是否已解析:
Loading catalog: file:///C:/so_test/lib/catalog.xml
Saxon-HE 9.4.0.6J from Saxonica
Java version 1.6.0_35
Analyzing query from {<results>{data(/test/foo)}</results>}
Analysis time: 122.70132 milliseconds
Processing file:/C:/so_test/test.xml
Using parser org.apache.xml.resolver.tools.ResolvingXMLReader
Building tree for file:/C:/so_test/test.xml using class net.sf.saxon.tree.tiny.TinyBuilder
Resolved public: -//TEST//Dan Test//EN
file:/C:/so_test/lib/test.dtd
Tree built in 0 milliseconds
Tree size: 5 nodes, 8 characters, 0 attributes
<?xml version="1.0" encoding="UTF-8"?><results>Success!</results>Execution time: 19.482079ms
Memory used: 20648808
附加信息
Saxon 分发 Apache 版本的 Xerces,所以使用resolver.jar
发现于Apache Xerces 发行版.