我需要从大约 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/