我下载了SaxonHE9-4-0-6J并希望在CLI上处理XHTML。然而,Saxon试图从W3C加载DTD,并且每个简单的命令都需要花费太多时间。
我有xml目录,我通过set env变量指向目录文件成功使用xmllint,但我不知道如何让Saxon使用它。谷歌揭示了与撒克逊一起使用目录的整个变化历史(因此混乱),没有一个让我高兴。
我下载了resolver.jar并将其设置在我的CLASSPATH中,但我不能让Saxon使用它。 在各种组合之后,我通过使用目录变量跟踪http://www.saxonica.com/documentation/sourcedocs/xml-catalogs.xml,如:
-catalog:path-to-my-catalog
(尝试了URI和常规路径),没有设置-r
,-x
,-y
切换,但Saxon没有看到它。我收到这个错误:
查询处理失败:无法加载Apache目录解析程序 文库
resolver.jar在我的类路径中设置,我可以在命令行中使用它:
C:\temp>java org.apache.xml.resolver.apps.resolver
Usage: resolver [options] keyword
Where:
-c catalogfile Loads a particular catalog file.
-n name Sets the name.
-p publicId Sets the public identifier.
-s systemId Sets the system identifier.
-a Makes the system URI absolute before resolution
-u uri Sets the URI.
-d integer Set the debug level.
keyword Identifies the type of resolution to perform:
doctype, document, entity, notation, public, system,
or uri.
OTOH,Saxon档案本身已经包含了XHTML和其他各种DTD,所以必须有一个简单的方法来解决这个问题。
如何在命令行上使用Saxon并指示它使用本地DTD?
答案 0 :(得分:5)
来自问题中的saxonica链接:
在命令行上使用-catalog选项时,将覆盖此选项 Saxon中使用的内部解析器(从9.4开始)重定向众所周知 W3C引用(例如XHTML DTD)到Saxon的本地副本 这些资源。因为这两个功能都依赖于设置XML 解析器的EntityResolver,无法使用它们 结合使用。
这听起来像萨克森自动使用well-known W3C DTDs的本地副本,但是如果指定-catalog
,则它不使用内部解析程序,您必须在目录中明确指定这些副本。 / p>
这是一个使用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>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 distributes the Apache version of Xerces,请使用Apache Xerces distribution中的resolver.jar
。
答案 1 :(得分:1)
Daniel Haley对如何使用Saxon的显式目录做出了比我更好的回答。
至于使用众所周知的DTD的内置副本,如果Saxon 9.4识别出所需资源的系统ID或公共ID,它将默认自动执行此操作。如果它要进入W3C网站,我们首先需要发现的是您正在使用的DOCTYPE的精确形式。
有关无法加载Apache目录解析程序的错误消息实际上意味着Saxon无法加载类org.apache.xml.resolver.CatalogManager。我想知道你是否使用了不包含这个类的解析器版本?我想不出任何其他解释。