2012-03-09 8 views
3

このxhtmlファイルをxmlとして解析すると、そのような単純なファイルで解析するのに約2分かかります。私は、doctype宣言を削除すると、すぐにすぐに解析することが分かりました。このファイルが解析に時間がかかりすぎる原因は間違っていますか?恐ろしい性能XML形式のDoctypeを持つXHTMLファイルの解析

Javaの例

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
DocumentBuilder bob = dbf.newDocumentBuilder(); 
Document template = bob.parse(new InputSource(new FileReader(xmlFile))); 

XHTML例

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ex="http://www.example.com/schema/v1_0_0"> 
    <head><title>Test</title></head> 
    <body> 
     <h1>Test</h1> 
     <p>Hello, World!</p> 
     <p><ex:test>Text</ex:test></p> 
    </body> 
</html> 

おかげ

編集:ソリューション

実際にそれがあった理由について提供された情報に基づいて問題を解決するにはthで起きているクラスパス

  • からこれらのファイルを読み取るために、カスタムのEntityResolverを作成したsrc/main/resourcesフォルダにDTD関連のファイルをダウンロード
  • は私のDocumentBuilderのトールド

    1. :E最初の場所、私はこれらの基本的な手順をしましたhow to validate XML using java?

      新のEntityResolver

      0:私の新しいのEntityResolver

    を使用するために、私はSOそうに答え、これを参照しました新しいのEntityResolverを使用する方法

    import java.io.IOException; 
    
    import org.xml.sax.EntityResolver; 
    import org.xml.sax.InputSource; 
    import org.xml.sax.SAXException; 
    
    public class LocalXhtmlDtdEntityResolver implements EntityResolver { 
    
        /* (non-Javadoc) 
        * @see org.xml.sax.EntityResolver#resolveEntity(java.lang.String, java.lang.String) 
        */ 
        @Override 
        public InputSource resolveEntity(String publicId, String systemId) 
          throws SAXException, IOException { 
         String fileName = systemId.substring(systemId.lastIndexOf("/") + 1);  
         return new InputSource( 
           getClass().getClassLoader().getResourceAsStream(fileName)); 
        } 
    
    } 
    

    :JavaはあなたのXHTMLファイルが指定されたDTDに従うことを検証するために、指定されたDTDとそのと含まれているファイルをダウンロードして

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setNamespaceAware(true); 
    DocumentBuilder bob = dbf.newDocumentBuilder(); 
    bob.setEntityResolver(new LocalXhtmlDtdEntityResolver()); 
    Document template = bob.parse(new InputSource(new FileReader(xmlFile))); 
    
  • +0

    他の人が指摘しているように、パーサーはインターネットからリソースをダウンロードしようとしています。これらのエンティティを自分で解決する必要があります(http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilder.html#setEntityResolver%28org.xml.sax.EntityResolver%29) 。何らかの理由で – McDowell

    +0

    が見つかった場合、この解決策は私にとってはうまくいかないでしょう。だから私はちょうどイカをインストールして追加しました。-Dhttp.proxyHost = localhost -Dhttp.proxyPort = 3128 – Leo

    答えて

    2

    実際、あなたはドキュメントを手に入れてうれしいです。 W3Cは、要求の量を処理できないため、これらの文書に対する要求に意図的に応答しません。パーサにローカルコピーを提供する必要があります。

    Javaの世界でこれを行う通常の方法は、Apache/Oasisカタログリゾルバを使用することです。

    Saxonの最新バージョンには、これらの一般的に使用されるDTDとエンティティファイルの知識が組み込まれています.SaxonにXMLパーザーの提供を許可すると、自動的にローカルコピーが使用されます。 XSLTやXQueryを使用してデータを処理していない場合でも、おそらくSaxon Configurationオブジェクトを作成し、そのgetSourceParser()メソッドを呼び出してXMLReaderを取得するだけで、これを利用できます。

    (おそらく、これはDOMから自分自身を離脱させる良い時期になるでしょう。JavaでXMLを処理するための選択肢の多くは、おそらくDOMが最悪です。低レベルのナビゲーションAPIを使用する必要がある場合は、JDOMやXOMなどの適切なものを選択してください。

    関連する問題