java 解析document_Java开发XML解析器Document、SAXParser、XMLStreamReader详解

  • Post author:
  • Post category:java


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()返回事件类型。

以下是我测试读取全国地区(含县级)数据的测试时间:

ef4b39ba76282acbe35d8e06b00f6dd4.png

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



版权声明:本文为weixin_35067976原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。