当前位置: 首页 > 面试题库 >

在JAVA中解析大型XML文档

靳祺然
2023-03-14
问题内容

我有以下问题:

我有一个XML文件(大约1GB),并且必须上下迭代(即不连续;一个接一个),以便获取所需的数据并对其进行一些操作。最初,我使用了DOM
Java包,但是很显然,在解析XML文件时,JVM达到了其最大堆空间并停止了运行。

为了解决这个问题,我想到的解决方案之一是找到另一个解析器,该解析器迭代XML中的每个元素,然后将其内容存储在硬盘上的临时SQLite数据库中。因此,通过这种方式,不会超过JVM的堆,并且一旦所有数据都填满,我将忽略XML文件并继续在临时SQLite数据库上进行操作。

还有另一种方法可以解决我的问题吗?


问题答案:

SAX(XML的简单API)将在这里为您提供帮助。

与DOM解析器不同,SAX解析器不会创建XML文档的内存表示形式,因此速度更快且使用的内存更少。而是,SAX解析器通过调用回调(即,通过调用org.xml.sax.helpers.DefaultHandler提供给解析器的实例上的方法)来将XML文档结构通知客户端

这是一个示例实现:

SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
DefaultHandler handler = new MyHandler();
parser.parse("file.xml", handler);

MyHandler您可以在其中定义在生成文档/元素的开始/结束之类的事件时要采取的措施。

class MyHandler extends DefaultHandler {

    @Override
    public void startDocument() throws SAXException {
    }

    @Override
    public void endDocument() throws SAXException {
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
    }

    // To take specific actions for each chunk of character data (such as
    // adding the data to a node or buffer, or printing it to a file).
    @Override
    public void characters(char ch[], int start, int length)
            throws SAXException {
    }

}


 类似资料:
  • 问题内容: 我需要一个XML解析器来解析大约1.8 GB的文件。 因此,解析器不应将所有文件加载到内存中。 有什么建议? 问题答案: 除了推荐的SAX解析之外,您还可以使用JDK(包javax.xml.stream)中包含的StAX API(一种SAX演进)。 StAX项目主页:http://stax.codehaus.org/Home 简介:http : //www.xml.com/pub/a/

  • 问题内容: 我正在尝试分析堆栈溢出数据转储,其中一个表称为posts.xml,其中有大约1000万个条目。样本XML: 我想解析此xml,但仅加载xml的某些属性,例如ID,PostTypeId,AcceptedAnswerId和其他2个属性。SAX中是否有办法只加载这些属性?如果有的话怎么办?对于SAX来说我还很陌生,所以一些指导会有所帮助。 否则,加载整个程序只会很慢,而且某些属性也不会被使用

  • 问题内容: 目前,我正在尝试使用SAX解析器,但是通过文件它大约3/4完全冻结了,我尝试分配更多的内存等,但没有得到任何改善。 有什么办法可以加快速度吗?更好的方法? 剥开它的骨头,所以我现在有了以下代码,并且在命令行中运行时,它的运行速度还没有达到我想要的速度。 使用“ java -Xms-4096m -Xmx8192m -jar reader.jar”运行它,得到的GC开销限制超出了文章700

  • 问题 你想使用尽可能少的内存从一个超大的XML文档中提取数据。 解决方案 任何时候只要你遇到增量式的数据处理时,第一时间就应该想到迭代器和生成器。 下面是一个很简单的函数,只使用很少的内存就能增量式的处理一个大型XML文件: from xml.etree.ElementTree import iterparse def parse_and_remove(filename, path):

  • 问题内容: 我需要解析大小为40GB的XML文件,然后进行规范化,然后插入到MySQL数据库中。我尚不清楚需要在数据库中存储多少文件,我也不知道XML结构。 我应该使用哪个解析器,您将如何进行呢? 问题答案: 在PHP中,您可以使用 Docs 读取超大型XML文件: 特大XML文件应以压缩格式存储在磁盘上。至少这是有道理的,因为XML文件具有很高的压缩率。例如,像gzip一样。 PHP 通过压缩包

  • 主要内容:Java DOM4J解析器 解析XML文档的步骤,Java DOM4J解析器 解析XML文档的示例Java DOM4J解析器 解析XML文档的步骤 以下是使用 DOM4J Parser 解析文档时使用的步骤。 导入与 XML 相关的包。 创建一个 SAXReader。 从文件或流创建文档。 通过调用 document.selectNodes() 使用 XPath 表达式获取所需的节点 提取根元素。 迭代节点列表。 检查属性。 检查子元素。 导入 XML 相关的包 创建一个文档生成器 从