1.Document
接口对象是官方出的,W3C标准,作为HTML、XML实体类加载到内存中,形成文档对象,然后使用循环进行数据解析。
2.SAXParser
SAXParser是一个用于处理XML的事件驱动的“推”模型。它不是W3C标准,但它是一个得到了广泛认可的API,大多数SAXParser解析器在实现的时候都遵循标准。
SAXParser解析器不象DOM那样建立一个整个文档的树型表示,而是使用数据流的方式读取,然后根据读取文档的元素类型进行事件反馈。这些事件将会推给事件处理器,而事件处理器则提供对文档内容的访问数据包装等。
事件处理器有三种基本类型:
用于访问XML DTD内容的DTDHandler;
用于低级访问解析错误的ErrorHandler;
用于访问文档内容的最普遍类型ContentHandler。
3.XMLStreamReader(StAX)
XMLStreamReader也属于数据留解析的一种,读入文件,按线性的方式从文件头一直读到文件尾;和SAXParser一样,使用事件驱动的模型来反馈事件。不同的是,XMLStreamReader不使用SAXParser的推模型,而是使用 “拉”模型进行事件处理。而且XMLStreamReader解析器不使用回调机制,而是根据应用程序的要求返回事件。XMLStreamReader还提供了用户友好的API用于读入和写出。
尽管SAXParser向ContentHandler返回不同类型的事件,但XMLStreamReader却将它的事件返回给应用程序,甚至可以以对象的形式提供事件。
当应用程序要求一个事件时,XMLStreamReader解析器根据需要从XML文档读取并将该事件返回给该应用程序。 XMLStreamReader提供了用于创建XMLStreamReader读写器的工具,所以应用程序可以使用StAX接口而无需参考特定实现的细节。
与Document和SAXParser不同,XMLStreamReader指定了两个解析模型:指针模型,如SAXParser,它简单地返回事件;迭代程序模型,它以对象形式返回事件(这里需要吐槽一下,我个人是比较喜欢SAXParser的handler事件处理的模式,代码方面比较值观),其实XMLStreamReader也可以跟SAXParser一样,但是需要额外的对象创建开销。
以下来看看示例代码:
1.Document解析XML的基础代码:
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(path);
Element element = document.getDocumentElement();
只需要三行代码就可以把Element对象读出来,这时候只需要遍历Element对象,就可以把数据组装出来。
2.SAXParser解析XML的基础代码
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
parser.parse(path, handler);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
也是三行代码,其中比较重要的是handler的事件回调,这里使用的是DefaultHandler。
3.XMLStreamReader(StAX)
InputStream in = new FileInputStream(path);
XMLInputFactory factory = XMLInputFactory.newFactory();
XMLStreamReader reader = factory.createXMLStreamReader(in);
while (reader.hasNext()) {
int event = reader.next();
if (event == XMLStreamConstants.START_ELEMENT) {
} else if (event == XMLStreamConstants.END_ELEMENT) {
} else if (event == XMLStreamConstants.END_DOCUMENT) {
out(“Use StAXParser object,and use time is ” + (System.currentTimeMillis() – t) + “ms”);
}
}
这里使用InputStream读入文件流,然后把流数据传递给XMLStreamReader对象,接着就循环遍历,在循环中必须使用.next()返回事件类型。
以下是我测试读取全国地区(含县级)数据的测试时间:
Document使用了103ms,其中SAXParser解析最快,基本上都是10~16ms之间,这取决于个人电脑,我的是比较烂的垃圾笔记本。
以下贴出读取全国XML地区数据的JAVA代码,三种方式:
一、Document
import model.AreaModel;
import model.AreaNode;
import model.CityModel;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import j