我必须使用Java中的XSLT处理具有DTD的XML文件.DTD确实是必需的,因为它包含我使用的实体的定义.(旁白:是的,使用实体来处理可能使用unicode的东西是一个坏主意;-)
当我运行转换时,它每次都从外部源下载DTD.我想它使用XML目录缓存的DTD,所以我给了TransformerFactory一个CatalogResolver为URIResolver:
URIResolver cr = new CatalogResolver();
tf = TransformerFactory.newInstance();
tf.setURIResolver(cr);
Transformer t = tf.newTransformer(xsltSrc);
t.setURIResolver(cr);
Result res = new SAXResult(myDefaultHandler());
t.transform(xmlSrc, res);
Run Code Online (Sandbox Code Playgroud)
但是当我运行转换时,它仍然通过网络下载DTD.(使用Xalan和Xerces作为Java5的一部分或独立使用或使用Saxon和Xerces.)
强制转换只使用DTD的本地副本需要什么?
rob*_*ast 11
(我在这里回答我自己的问题是为了救我下次,或者其他任何人,修补的日子我需要找到答案.)
改变DTD解决方式真正需要的是一个EntityResolver.不幸的是,无法设置EntityResolver要使用的Transformer.所以,你必须创建一个XMLReader先用CatalogResolver为EntityResolver:
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
XMLReader r = spf.newSAXParser().getXMLReader();
EntityResolver er = new CatalogResolver();
r.setEntityResolver(er);
Run Code Online (Sandbox Code Playgroud)
并用于Transformer:
SAXSource s = new SAXSource(r, xmlSrc);
Result res = new SAXResult(myDefaultHandler());
transformer.transform(s, res);
Run Code Online (Sandbox Code Playgroud)
您可以使用此代码在 Xerces 中禁用此类功能:
org.dom4j.io.SAXReader reader = new org.dom4j.io.SAXReader();
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
Run Code Online (Sandbox Code Playgroud)
此代码示例使用 Dom4j,但在其他 Java XML 库(如 JDOM)中也存在类似的“setFeature”功能。
| 归档时间: |
|
| 查看次数: |
5702 次 |
| 最近记录: |