在解析java文件中的XML文件时得到错误
问题描述:
我在我的代码中使用下列类来解析3.43MB的巨大XML数据,并试图将节点值检索到哈希表中。在解析java文件中的XML文件时得到错误
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
我在这里的代码抛出错误:
String nodeValue=node.getNodeValue();
Error is:
Exception in thread "main" java.lang.StackOverflowError
at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.getNodeValueString(Unknown Source)
at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.getNodeValueString(Unknown Source)
at com.sun.org.apache.xerces.internal.dom.DeferredTextImpl.synchronizeData(Unknown Source)
at com.sun.org.apache.xerces.internal.dom.CharacterDataImpl.getNodeValue(Unknown Source)
即使尝试打印数据在控制台这样的:
System.out.println(node.getNodeValue());
错误是这样的:
Exception in thread "main" java.lang.StackOverflowError
at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.getNodeValueString(Unknown Source)
at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.getNodeValueString(Unknown Source)
at com.sun.org.apache.xerces.internal.dom.DeferredTextImpl.synchronizeData(Unknown Source)
at com.sun.org.apache.xerces.internal.dom.CharacterDataImpl.getNodeValue(Unknown Source)
我相信node.getNodeValue()
无法读取XML数据的某个点。
我无法摆脱这个错误。请帮帮我。
答
你碰巧使用(无限)递归吗?
或者可能是一个损坏的XML文件? (试着用你最喜欢的浏览器打开它)
答
一个3.4 MB的文件并不是那么大,但是如果它包含了很多嵌套的术语,你正在使用的库可能无法应付这种情况。例如一个HTML页面可能有很多不匹配的标签,这可能导致XML解析器以这种方式失败。
例如
<html><body><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> etc
几百或几千个<br>
可能足以排出堆栈。
答
至于据我所知Node.getNodeValue()不会递归通过。它只是打印当前节点的字符串值。这可能是数据和代码相关的错误。
发布您的代码和XML结构(如果不是完整的xml)将有所帮助。
或者,您可以尝试使用SAX解析器。
答
您可能只需要使用-XssSOMETHING
以允许更多堆栈。如果确实存在无限递归,调试器会在堆栈上反复显示相同的内容。
@ Peter:你说什么是有道理的,但你为什么会怀疑有人会用XML解析器来解析不是XML的HTML? – Cratylus 2011-12-27 10:53:34
@ user384706 HTML仅仅是一个例子。任何嵌套级别过高的文件都可能导致使用递归的解析器炸毁。 – 2011-12-27 10:58:22
@ Peter:我明白了。我认为问题是不匹配的标签而不是递归本身 – Cratylus 2011-12-27 11:11:59