2011-07-28 23 views
4

XMLファイルの後処理用にJavaアプリケーションを作成しています。 これらのXMLファイルは、Semantic MediawikiのRDF-Exportから来ているので、rdf/xmlの構文を持っています。JDOM/DOMでXMLエンティティの解決を無効にする

私の問題は次のとおりです。 xmlファイルを読むと、ファイル内のすべてのエンティティがDoctypeで指定された値に解決されます。文書型の例では私は

<!DOCTYPE rdf:RDF[ 
<!ENTITY wiki 'http://example.org/smartgrid/index.php/Special:URIResolver/'> 
.. 
]> 

を有し、ルート要素に

<rdf:RDF 
xmlns:wiki="&wiki;" 
.. 
> 

これは私はJDOMと使用しようとしている

<swivt:Subject rdf:about="http://example.org/smartgrid/index.php/Special:URIResolver/Main_Page"> 

<swivt:Subject rdf:about="&wiki;Main_Page"> 

となる手段標準のJava DOMです。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     factory.setExpandEntityReferences(false); 
     factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 

とJDOM

ため
SAXBuilder builder = new SAXBuilder(); 
    builder.setExpandEntities(false); //Retain Entities 
    builder.setValidation(false); 
    builder.setFeature("http://xml.org/sax/features/resolve-dtd-uris", false); 

しかし、実体はXML文書全体のどれも少なく全体で解決されます: 私はここでは関係だと思うのコードは、標準のDOMのためです。 何か不足していますか?検索の時間は「ExpandEntities」コマンドにしか導かれませんでしたが、動作していないようです。

任意のヒントが高く評価される:)

答えて

0

私は、検証(機能http://xml.org/sax/features/validation)が真であるならば、それはsetExpandEntities(false)をオーバーライドすると信じています。また、その機能をfalseに設定して検証を無効にしてみてください。

0

this oneのようなさまざまなヒントがあります。属性のエンティティ展開を無効にすることはできません。私はそれが醜いものではないと示唆するものが何であるか分からない。たとえば、の場合、は "null" DTDをもたらすEntityResolverを使用できます。これは "wiki"の展開を "&wiki;"と定義したものです。より良い方法があるように見える!

4

私は、JDOMよくあるご質問をお勧めします。

[http://www.jdom.org/docs/faq.html#a0350]

私はロードからDTDを保つにはどうすればよいですか?検証をオフにしても、パーサーはDTDファイルをロードしようとします。

検証がオフになっている場合でも、外部エンティティ宣言のDTDを解析するために、XMLパーサーはデフォルトで外部DTDファイルをロードします。 Xercesには、 "http://apache.org/xml/features/nonvalidating/load-external-dtd"という名前のこの動作を無効にする機能があります.Xercesを使用していることがわかっている場合は、Builderでこの機能を設定できます。

builder.setFeature(
    "http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 

あなたはクリムゾンのような別のパーサーを使用している場合は、あなたの最善の策は、実際に別のファイルを読み込むことなくDTDを解決するのEntityResolverを設定することです。

import org.xml.sax.*; 
import java.io.*; 

public class NoOpEntityResolver implements EntityResolver { 
    public InputSource resolveEntity(String publicId, String systemId) { 
    return new InputSource(new StringBufferInputStream("")); 
    } 
} 

その後ビルダーで...

builder.setEntityResolver(new NoOpEntityResolver()); 

このアプローチには欠点があります。ドキュメント内のエンティティは空の文字列に解決され、効果的に消えます。ドキュメントにエンティティがある場合は、SetExpandEntities(false)コードを設定し、EntityResolverがDocTypeを抑制するようにする必要があります。

関連する問題