在解析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>可能足以排出堆栈。

+0

@ Peter:你说什么是有道理的,但你为什么会怀疑有人会用XML解析器来解析不是XML的HTML? – Cratylus 2011-12-27 10:53:34

+0

@ user384706 HTML仅仅是一个例子。任何嵌套级别过高​​的文件都可能导致使用递归的解析器炸毁。 – 2011-12-27 10:58:22

+0

@ Peter:我明白了。我认为问题是不匹配的标签而不是递归本身 – Cratylus 2011-12-27 11:11:59

至于据我所知Node.getNodeValue()不会递归通过。它只是打印当前节点的字符串值。这可能是数据和代码相关的错误。

发布您的代码和XML结构(如果不是完整的xml)将有所帮助。

或者,您可以尝试使用SAX解析器。

您可能只需要使用-XssSOMETHING以允许更多堆栈。如果确实存在无限递归,调试器会在堆栈上反复显示相同的内容。