如果性能对您而言很重要,则应首选SAX或StAX(http://en.wikipedia.org/wiki/StAX)而不是DOM。
使用时
DOM,第一次将
XML文件解析为对象模型,然后您可以提出要求。因此,对您而言,算法有两遍。
使用时SAX,在解析过程中,某些基于事件或推送模型的回调将被调用(
startdocument,endElement...) 。
SAX
使用StAX,您可以控制解析。您将光标从一个元素移动到另一个。这是拉模型。
对于包含32910000人的文件,我将我的版本与SAX的(Blaise Doughan的)过度回答进行了比较StAX。我删除了所有System.out.println指示。我的程序花了106秒读取所有文件,另一个花了94秒。我想这SAX是较慢的,因为callback即使它们都不执行任何操作都将被调用(push模型),而使用StAX时,光标仅在“ interresting”元素(pull模型)上移动。
例如,使用Java 7:
import java.io.File;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 ReadAndPrintXMLFileWithSax { public static void main(String[] args) throws Exception { SAXParserFactory fabrique = SAXParserFactory.newInstance(); SAXParser parser = fabrique.newSAXParser(); File file = new File("book.xml"); BookHandler handler = new BookHandler(); parser.parse(file, handler); } public static class BookHandler extends DefaultHandler { private int count = 0; private StringBuilder buffer; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { switch (qName) { case "person": count++; break; case "first": buffer = new StringBuilder("First Name : "); break; case "last": buffer = new StringBuilder("Last Name : "); break; case "age": buffer = new StringBuilder("Age : "); break; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { String content = new String(ch, start, length); if (buffer != null) buffer.append(content); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { switch (qName) { case "first": case "last": case "age": System.out.println(buffer.toString()); break; } } @Override public void enddocument() throws SAXException { System.out.println(count + " persons"); } }}


