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都需要对文件的文章解析中途不能停止)。

 

posted @ 2019-10-10 16:57  污喵王  阅读(521)  评论(0编辑  收藏  举报