получение stackoverflowerror при преобразовании org.w3c.dom.Document в org.dom4j.Document - PullRequest
0 голосов
/ 19 января 2012

Я получаю stackoverflowerror при передаче org.w3c.dom. Документ к org.dom4j. Документ

Код:

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;   
    } 

log:

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)

На самом деле я хочу преобразовать XML в строку с помощью метода asXML org.dom4j.Document.Возможно ли это преобразование без преобразования org.w3c.dom.Document в org.dom4j.Document?Как ?

Ответы [ 2 ]

0 голосов
/ 19 января 2012

при работе с тяжелым файлом вы не должны использовать DOM-ридер, а SAX.Я предполагаю, что ваша цель - вывести ваш документ в строку.

Здесь вы можете найти некоторые различия между SAX и DOM ( source ):

SAX

  • Узел Parsesпо узлу
  • Не сохраняет XML в памяти
  • Мы не можем вставить или удалить узел
  • SAX - это анализатор на основе событий
  • SAX - этоПростой API для XML
  • не сохраняет комментарии
  • SAX обычно работает немного быстрее, чем DOM

DOM

  • Сохраняет весь XML-документ в памяти перед обработкой
  • Занимает больше памяти
  • Мы можем вставлять или удалять узлы
  • Обход в любом направлении.
  • DOM - это синтаксический анализатор древовидной модели
  • API объектной модели документа (DOM)
  • Сохраняет комментарии
  • SAX обычно работает немного быстрее, чем DOM

Вам не нужно создавать модель, которая будет занимать много места в памяти.Вам нужно только пролистать узлы, чтобы выводить их один за другим.

Здесь вы найдете некоторый код, начинающийся с ;тогда вы должны реализовать алгоритм обхода дерева.

С уважением

0 голосов
/ 19 января 2012

Взгляните на java.lang.StackOverflowError в dom-парсере . Очевидно, попытка загрузить огромный XML-файл в строку может привести к StackoverflowException. Я думаю, это потому, что синтаксический анализатор использует регулярные выражения для поиска начала и конца тегов, что включает в себя рекурсивные вызовы длинных строк, как описано в java.lang.StackOverflowError, при использовании RegEx для анализа больших строк .

Вы можете попытаться разделить XML-документ, проанализировать разделы по отдельности и посмотреть, поможет ли это.

...