2011-11-10 14 views
10

XOM XMLライブラリでファイルを解析するときにDTD宣言を無視する方法を教えてください。私のファイルには、次の行があります。XMLを解析するときにDTDを無視する

<?xml version="1.0"?> 
<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "NCBI_BlastOutput.dtd"> 
//rest of stuff here 

をそして、私は)(私の文書を構築しようとすると、DTDファイル用にFileNotFound例外を取得します。私はこのファイルを持っていないことを知っていて、気にしないので、XOMを使用するときにどのように削除できますか?私はこのラインでNullPointerExceptionが取得

public BlastXMLParser(String filePath) { 
    Builder b = new Builder(false); 
    //not a good idea to have exception-throwing code in constructor 
    try { 

     _document = b.build(filePath); 
    } catch (ParsingException ex) { 
     Logger.getLogger(BlastXMLParser.class.getName()).log(Level.SEVERE,"err", ex); 
    } catch (IOException ex) { 
     // 
    } 

private Elements getBlastReads() { 
    Element root = _document.getRootElement(); 
    Elements rootChildren = root.getChildElements(); 

    for (int i = 0; i < rootChildren.size(); i++) { 
     Element child = rootChildren.get(i); 
     if (child.getLocalName().equals("BlastOutput_iterations")) { 

      return child.getChildElements(); 
     } 
    } 

    return null; 
} 
} 

:ここ

は、コードスニペットで私は成功し、それを解析することができ、ソースのXMLファイルから削除DTDラインで

Element root = _document.getRootElement(); 

が、これを最終的な生産システムではオプションではありません。

+0

解析に使用する 'code'を表示できますか? – bbaja42

答えて

-4

ドキュメントによれば、これは検証なしでドキュメントを解析する方法です。 ValidityException

+1

私のコードスニペットを見てください。ドキュメントに書かれているものに従ってください。私はこれを動作させることができません。 – LordDoskias

13

好ましい解決策は、に次のようになります。

try { 
    Builder parser = new Builder(); 
    Document doc = parser.build("http://www.cafeconleche.org/"); 
} 
catch (ParsingException ex) { 
    System.err.println("Cafe con Leche is malformed today. How embarrassing!"); 
} 
catch (IOException ex) { 
    System.err.println("Could not connect to Cafe con Leche. The site may be down."); 
} 

あなたがnew Builder(true)を呼び出す必要がありXMLスキーマを検証したい場合は:今、さらに別の例外がスローされる可能性が

try { 
    Builder parser = new Builder(true); 
    Document doc = parser.build("http://www.cafeconleche.org/"); 
} 
catch (ValidityException ex) { 
    System.err.println("Cafe con Leche is invalid today. (Somewhat embarrassing.)"); 
} 
catch (ParsingException ex) { 
    System.err.println("Cafe con Leche is malformed today. (How embarrassing!)"); 
} 
catch (IOException ex) { 
    System.err.println("Could not connect to Cafe con Leche. The site may be down."); 
} 

ご注意くださいEntityResolverを実装してDTDの要求をインターセプトし、これらを埋め込みコピーにリダイレクトします。あなた

  1. は、DTDへのアクセスを持っていないと
  2. は、あなたが(離れて検証から、それはまた、文書内で使用されている文字エンティティを宣言する可能性がある)と
  3. それを必要としません。絶対に確信している場合Xerces XML Parserの実装を使用しています

対応するSAX機能を設定することで、DTDの取得を無効にできます。 XOMでは、これは次のようにXMLReaderをBuilderコンストラクタに渡すことで可能になります。

import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.XMLReaderFactory; 

... 

XMLReader xmlreader = XMLReaderFactory.createXMLReader(); 
xmlreader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
Builder builder = new Builder(xmlreader); 
+0

これがそうでなければ、私のxmlreaderはDOCTYPE宣言を見た後、 –

関連する問題