【问题标题】:Getting error while parsing an XML file in java在 java 中解析 XML 文件时出错
【发布时间】:2011-12-27 10:37:55
【问题描述】:

我在我的代码中使用以下类来解析 3.43MB 的巨大 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 数据。
我无法摆脱这个错误。请帮帮我。

【问题讨论】:

    标签: java xml dom sax stack-overflow


    【解决方案1】:

    你碰巧使用(无限)递归吗?

    或者可能是损坏的 xml 文件? (尝试用你喜欢的浏览器打开)

    【讨论】:

      【解决方案2】:

      一个 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
      

      几百或几千个&lt;br&gt; 就足以耗尽堆栈。

      【讨论】:

      • @Peter:你说的有道理。但是你为什么会怀疑有人会使用XML解析器来解析不是XML的HTML呢?
      • @user384706 HTML 只是一个例子。任何嵌套层级过多的文件都可能导致使用递归的解析器崩溃。
      • @Peter:我明白了。我认为问题在于不匹配的标签而不是递归本身
      【解决方案3】:

      据我了解,Node.getNodeValue() 不会递归。它只是打印当前节点的值,这是一个字符串。这可能是数据和您的代码相关错误。

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

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

      【讨论】:

        【解决方案4】:

        您可能只需要使用-XssSOMETHING 来允许更多堆栈。如果确实存在无限递归,调试器将在堆栈上一遍又一遍地向您显示相同的内容。

        【讨论】:

          猜你喜欢
          • 2015-11-18
          • 1970-01-01
          • 2015-09-18
          • 2013-03-07
          • 2015-05-23
          • 1970-01-01
          • 1970-01-01
          • 2016-07-13
          相关资源
          最近更新 更多