java - 部分读取xml文件

标签 java xml parsing file-io gosu

我需要从大约 100 个长达 200,000 行的 XML 文件中读取前 15 行。有没有办法使用类似 BufferedReader 的东西有效地做到这一点? this question 中概述的步骤使用 DocumentBuilder.parse(String) ;这会尝试一次解析整个文件。

编辑:前 15 个元素包含有关文件的元数据(页面名称、最后编辑日期等),我想将其解析到表格中。

最佳答案

这可能是您想要做的 - 正如我在评论中所写,使用 SAX 解析器,当满足停止条件时使用此

How to stop parsing xml document with SAX at any time?

编辑:

测试.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <first>
        <inner>data</inner>
    </first>
    <second>second</second>
    <third>third</third>
    <next>next</next>
</root>

ReadXmlUpToSomeElementSaxParser.java

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ReadXmlUpToSomeElementSaxParser extends DefaultHandler {

    private final String lastElementToRead;

    public ReadXmlUpToSomeElementSaxParser(String lastElementToRead) {
        this.lastElementToRead = lastElementToRead;
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        // just for showing what is parsed
        System.out.println("startElement: " + qName);
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (lastElementToRead.equals(qName)) {
            throw new MySaxTerminatorException();
        }
    }

    public static void main(String[] args) throws Exception {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();

        try {
            saxParser.parse("src/test.xml", new ReadXmlUpToSomeElementSaxParser("second"));
        } catch (MySaxTerminatorException exp) {
            // nothing to do, expected
        }
    }

    public class MySaxTerminatorException extends SAXException {
    }

}

输出

startElement: root
startElement: first
startElement: inner
startElement: second

为什么这样更好?仅仅是因为一些应用程序可以发送给你

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <first><inner>data</inner></first>
    <second>second</second>
    <third>third</third>
    <next>next</next>
</root>

面向行的方法会失败...

我提供了不计算元素的解析器,以表明可以根据实现...所需的业务逻辑来定义条件

characters() 警告

读取元素中的数据可以使用character()方法,但请注意

SAX parsers may return all contiguous character data in a single chunk, or they may split it into several chunks

阅读更多 JavaDoc

关于java - 部分读取xml文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23344725/

相关文章:

c# - 将带点和逗号的数字转换为 double 会失败

java - 什么是实现 REstful API 的最佳轻量级/高性能嵌入式 Web 服务器

java - 使用 ColdFusion、Java 或命令行实用程序将网页转换为图像?

java - jOOQ - 加入嵌套子查询

java - Jersey 客户端无法使用 JAXB Moxy 序列化发送/接收 XML 消息?

C++ sscanf 显示意外行为

java - 如何迭代百里香中的输入值

java - 如何使用 JAXB 序列化多个对象

java - Android:onItemClick 和 onItemLongClick 没有响应

java - 使用 JSONTokener 将字符串解析为 JSONObject 或 JSONArray