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 parser 中的 java.lang.StackOverflowError。显然,尝试将巨大的 XML 文件加载到 String 中可能会导致StackoverflowException. 我认为这是因为解析器使用正则表达式来查找标签的开始和结束,这涉及到对长字符串的递归调用,如java.lang.StackOverflowError 中所述,同时使用正则表达式来解析大字符串

您可以尝试拆分 XML 文档并分别解析这些部分,看看是否有帮助。

于 2012-01-19T13:13:10.683 回答
0

处理大文件时,不应使用 DOM 阅读器,而应使用 SAX 阅读器。我假设您的目标是将文档输出到字符串。

在这里您可以找到 SAX 和 DOM 之间的一些区别(来源):

萨克斯

  • 逐个节点解析
  • 不将 XML 存储在内存中
  • 我们无法插入或删除节点
  • SAX 是一个基于事件的解析器
  • SAX 是 XML 的简单 API
  • 不保留评论
  • SAX 通常比 DOM 运行得快一点

DOM

  • 在处理之前将整个 XML 文档存储到内存中
  • 占用更多内存
  • 我们可以插入或删除节点
  • 向任何方向移动。
  • DOM 是一个树模型解析器
  • 文档对象模型 (DOM) API
  • 保留评论
  • SAX 通常比 DOM 运行得快一点

您不需要生成需要大量内存空间的模型。你只需要爬过节点,一一输出。

在这里,你会发现一些代码开始;那么你应该实现一个树遍历算法。

问候

于 2012-01-19T13:26:39.710 回答