我在将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,这种转换是否可行?怎么样 ?
答案 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 强>
<强> DOM 强>
您不需要生成需要大量内存空间的模型。您只需要遍历节点就可以逐个输出它们。
在这里,你会发现some code to start with;那么你应该实现一个树遍历算法。
此致