XML的几种解析方式
一. DOM
DOM的全称是Document Object Model,也即文档对象模型,是一个接口定义语言,以层次结构组织的节点或信息片断的集合(树)。
把要解析的整个xml加载到到内存中.在内存中形成一个树形结构。
优点:
由于树在内存中是持久的,通过DOM接口,可以在任何时候访问或修改XML文档中的任何一部分数据和结构,它提供的随机访问方式给应用程序的开发带来了很大的灵活性。
编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。
缺点:
当文档比较大或者结构比较复杂时,对内存的需求就比较高。
对于结构复杂的树的遍历也是一项耗时的操作,实现效率不十分理想。
//创建一个DocumentBuilderFactory的对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //创建DocumentBuilder对象 DocumentBuilder db = dbf.newDocumentBuilder(); //通过DocumentBuilder对象的parser方法加载xml文件到当前项目下 Document document = db.parse("items.xml"); //获取所有item节点的集合 NodeList itemList = document.getElementsByTagName("item"); //遍历每一个item节点 for (int i = 0; i < itemList.getLength(); i++) { Node item = itemList.item(i); //获取item节点的所有属性集合 NamedNodeMap attrs = item.getAttributes(); //遍历item的属性 for (int j = 0; j < attrs.getLength(); j++) { Node attr = attrs.item(j); System.out.print("属性名:" + attr.getNodeName()); System.out.println("--属性值" + attr.getNodeValue()); } //解析item节点的子节点 NodeList childNodes = item.getChildNodes(); for (int k = 0; k < childNodes.getLength(); k++) { //TODO Something } }
二、SAX
SAX的全称是Simple APIs for XML,采用的事件模型。进行语法分析的事件驱动API与DOM不同。
SAX提供的访问模式是一种顺序模式,这是一种快速读取XML数据的方式,应用程序在读取数据时分析就能够立即开始,一边解析 一边处理 一边释放内存。
优点:
内存耗费比较小,不需要将数据存储在内存中。
分析能够立即开始,而不是等待所有的数据被处理。
缺点:
很难同时访问XML文件中的多处不同数据。
只支持读,不能进行增/删/改。
需要开发人员自己来决定所要处理的TAG,编码工作会比较困难。
三、JDOM
Java的特定模型,直接为JAVA编程服务,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。
JDOM基于树型结构,既具有树的便利,也有SAX的JAVA规则,利用了更为强有力的JAVA语言的诸多特性(重载、集合概念以及映射),比使用DOM实现更快,简化了与XML的交互。
优点:
JDOM把SAX和DOM的功能有效地结合起来,JDOM仅使用具体类而不使用接口,这在某些方面简化了API。
没有向下兼容的限制,因此比DOM简单。
缺点:
同样基于树的处理XML的Java API,把树加载在内存,因此不能处理大于内存的文档。
JDOM表示XML文档逻辑模型,并不能保证每个字节真正变换。
四、DOM4J
dom4j.org出品的一个开源XML解析包,应用于Java平台,采用了Java集合框架并完全支持DOM,SAX。
优点:
性能好、功能强、使用方便。
最大的特色是使用大量的接口,这也是它被认为比JDOM灵活的主要原因
缺点:
也是将整个文档读入,然后解析,所以仍然存在内存问题。
五、Pull
Xmlpull解析是Android中内置的解析器,解析原理类似SAX,一边解析 一边处理。
Pull解析器也提供了类似SAX的事件,开始文档START_DOCUMENT和结束文档END_DOCUMENT,开始元素START_TAG和结束元素END_TAG,遇到元素内容TEXT等。
区别SAX:
需要调用next() 主动提取事件,可以根据判断停止解析(DOM和SAX都需要对文件的文章解析中途不能停止)。