2009-07-07 3 views
7

JavaでXSLTを持つDTDを持つXMLファイルを処理する必要があります。 DTDは私が使用するエンティティの定義を含んでいるので本当に必要です。 (脇に:はい、ユニコードを使用できるもののエンティティを使用することは悪い考えです;-)XSLT(XML Transformer)を使用しているときにDTDをダウンロードしないようにする

変換を実行すると、毎回外部ソースからDTDがダウンロードされます。私はTransformerFactoryを与えたので、それはDTDをキャッシュするためにXMLカタログを使用したい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です。残念ながらEntityResolverTransformerで使用するように設定することはできません。

SAXParserFactory spf = SAXParserFactory.newInstance(); 
spf.setNamespaceAware(true); 
XMLReader r = spf.newSAXParser().getXMLReader(); 
EntityResolver er = new CatalogResolver(); 
r.setEntityResolver(er); 

Transformerのためにそれを使用します:だから、そのEntityResolverとしてCatalogResolverXMLReader最初に作成する必要が

SAXSource s = new SAXSource(r, xmlSrc); 
Result res = new SAXResult(myDefaultHandler()); 
transformer.transform(s, res); 
+0

+1あなた自身で解決して結果を共有するには(これまで見た質問を削除するのではなく)。 – Tomalak

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

関連する問題