在将org.w3c.dom.Document转换为org.dom4j.Document时获取stackoverflower

时间:2012-01-19 12:08:07

标签: java domparser

我在将org.w3c.dom.Document转发给org.dom4j.Document时收到了stackoverflower错误

代码:

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,这种转换是否可行?怎么样 ?

2 个答案:

答案 0 :(得分:0)

看看java.lang.StackOverflowError in dom parser。显然,尝试将巨大的XML文件加载到String中可能会产生StackoverflowException。我认为这是因为解析器使用正则表达式来查找标记的开始和结束,这涉及java.lang.StackOverflowError while using a RegEx to Parse big strings中描述的长字符串的递归调用。

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

答案 1 :(得分:0)

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

您可以在这里找到SAX和DOM(source)之间的一些差异:

<强> SAX

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

<强> DOM

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

您不需要生成需要大量内存空间的模型。您只需要遍历节点就可以逐个输出它们。

在这里,你会发现some code to start with;那么你应该实现一个树遍历算法。

此致