0

org.w3c.dom.Document を org.dom4j.Document に変換しているときに、stackoverflowerror が発生します。

コード :

public static org.dom4j.Document getDom4jDocument(Document w3cDocument)
    {
        //System.out.println("XMLUtility : Inside getDom4jDocument()");
        org.dom4j.Document dom4jDocument  = null;
        DOMReader xmlReader  = null;
        try{
            //System.out.println("Before conversion of w3cdoc to dom4jdoc");
            xmlReader = new DOMReader();            
            dom4jDocument = xmlReader.read(w3cDocument);
            //System.out.println("Conversion complete");
        }catch(Exception e){
            System.out.println("General Exception :- "+e.getMessage());
        }
        //System.out.println("XMLUtility : getDom4jDocument() Finished");
        return dom4jDocument;   
    } 

ログ:

java.lang.StackOverflowError
    at java.lang.String.indexOf(String.java:1564)
    at java.lang.String.indexOf(String.java:1546)
    at org.dom4j.tree.NamespaceStack.getQName(NamespaceStack.java:158)
    at org.dom4j.io.DOMReader.readElement(DOMReader.java:184)
    at org.dom4j.io.DOMReader.readTree(DOMReader.java:93)
    at org.dom4j.io.DOMReader.readElement(DOMReader.java:226)
    at org.dom4j.io.DOMReader.readTree(DOMReader.java:93)
    at org.dom4j.io.DOMReader.readElement(DOMReader.java:226)

実は、org.dom4j.Document の asXML メソッドを使って XML を文字列に変換したいのです。org.w3c.dom.Document を org.dom4j.Document に変換せずにこの変換は可能ですか? どのように ?

4

2 に答える 2

0

重いファイルを処理するときは、DOM リーダーではなく SAX リーダーを使用する必要があります。あなたの目標は、ドキュメントを文字列に出力することだと思います。

ここでは、SAX と DOM ( source )のいくつかの違いを見つけることができます。

サックス

  • ノードごとに解析します
  • XML をメモリに格納しない
  • ノードを挿入または削除できません
  • SAX はイベント ベースのパーサーです。
  • SAX は XML 用のシンプルな API です
  • コメントを保持しません
  • SAX は通常、DOM よりも少し高速に実行されます。

ドム

  • 処理前に XML ドキュメント全体をメモリに格納します。
  • より多くのメモリを占有します
  • ノードを挿入または削除できます
  • 任意の方向にトラバースします。
  • DOM はツリー モデルのパーサーです
  • ドキュメント オブジェクト モデル (DOM) API
  • コメントを保持
  • SAX は通常、DOM よりも少し高速に実行されます。

多くのメモリ空間を必要とするモデルを作成する必要はありません。ノードを 1 つずつクロールして、ノードを 1 つずつ出力するだけです。

ここには、開始するコードがいくつかあります。次に、ツリー トラバーサル アルゴリズムを実装する必要があります。

よろしく

于 2012-01-19T13:26:39.710 に答える
0

dom parserの java.lang.StackOverflowError を見てください。どうやら、巨大な XML ファイルを String にロードしようとすると、StackoverflowException. これは、パーサーがタグの開始と終了を見つけるために正規表現を使用しているためだと思います。これには、RegEx を使用して大きな文字列を解析しているときに java.lang.StackOverflowErrorで説明されているように、長い文字列の再帰呼び出しが含まれます。

XML ドキュメントを分割してセクションを個別に解析し、それが役立つかどうかを確認できます。

于 2012-01-19T13:13:10.683 に答える