2009-07-07 48 views
7

我必須處理具有帶Java中的XSLT的DTD的XML文件。 DTD是非常需要的,因爲它包含我使用的實體的定義。 (撇開:是的,使用實體來使用unicode是一個壞主意;-)防止使用XSLT進行DTD下載,即XML Transformer

當我運行轉換時,它每次都從外部源下載DTD。我想它使用XML目錄緩存的DTD,所以我給了一個TransformerFactory作爲CatalogResolverURIResolver

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的本地副本?

回答

10

(我在這裏回答我的問題的下一次救我,或其他任何人,修修補補的日子裏,我需要找到答案。)

它真正需要改變的方式的DTD是解決的是EntityResolver。不幸的是,不可能將EntityResolver設置爲由Transformer使用。所以,你必須創建一個第一XMLReaderCatalogResolverEntityResolver

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); 
+0

+1用於自己解決並分享結果(而不是刪除問題,我已經看到了)。 – Tomalak 2009-07-07 13:31:10

3

您可以使用此代碼禁用這種功能中的Xerces :

org.dom4j.io.SAXReader reader = new org.dom4j.io.SAXReader(); 
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 

此代碼示例使用Dom4j,但其他java XML libra中存在類似的「setFeature」功能像JDOM這樣的國家。

+1

http://xerces.apache.org/xerces2-j/features.html顯然提供這些功能。 – PypeBros 2013-02-07 13:59:40