我必须在 Java 中处理具有 DTD 和 XSLT 的 XML 文件。 DTD 确实是必要的,因为它包含我使用的实体的定义。 (旁白:是的,将实体用于可以使用 unicode 的东西是一个坏主意;-)
当我运行转换时,它每次都会从外部源下载 DTD。我希望它使用 XML 目录来缓存 DTD,所以我给出了TransformerFactory
a CatalogResolver
as 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);
但是当我运行转换时,它仍然通过网络下载 DTD。 (使用 Xalan 和 Xerces 作为 Java5 的一部分或独立使用,或者使用 Saxon 和 Xerces。)
如何强制转换仅使用 DTD 的本地副本?
(我在这里回答我自己的问题,是为了下次我或其他人节省我需要寻找答案的修补日子。)
真正需要改变 DTD 解析方式的是EntityResolver
。不幸的是,无法设置EntityResolver
供使用Transformer
。所以你必须创建一个XMLReader
首先与CatalogResolver
as its EntityResolver
:
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
XMLReader r = spf.newSAXParser().getXMLReader();
EntityResolver er = new CatalogResolver();
r.setEntityResolver(er);
并将其用于Transformer
:
SAXSource s = new SAXSource(r, xmlSrc);
Result res = new SAXResult(myDefaultHandler());
transformer.transform(s, res);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)