利用Dom,Sax,Pull三种方式解析xml文件

本文介绍了XML解析的三种常见方式——DOM、SAX和Pull解析的优缺点及适用范围,并通过示例代码展示了每种解析方式的用法。DOM解析将整个XML文档加载到内存,适合需要修改文档的情况;SAX解析速度较快,适用于大文档,需要自定义事件逻辑;Pull解析是SAX的简化版,不需要手动写事件逻辑,但修改文档较为困难。
摘要由CSDN通过智能技术生成

最近找工作,看到许多公司的要求里都写了要会xml解析,所以就把之前的xml解析知识又重新回顾了一下,写个小例子.

解析xml文件常用的几种方式也就dom,sax,pull了,并且面试官经常问到的也是这三种解析方式之间的优缺点以及使用情况,先说一下这三种方式的优缺点和使用情况吧:

其实dom,sax,pull之间的优缺点网上有很多,讲的搞不好比我的还要深入和贴切,不过还是要说一下,毕竟自己以后还是要回顾知识的,到时候不要再翻别人的文章了,

dom解析:优点:简单易学,可以对文档进行修改,如删除节点,增加节点等,灵活性较高,读取速度快,缺点:解析时,把整个xml文档读到内存中,占用较多资源,

使用范围:如果需要对文档进行修改,dom解析肯定是首选,如果只是读取文档中的某些内容或全部内容,且不作修改,建议不要使用dom解析,而用sax解析或者pull解析.

sax解析:优点:解析速度快,不需要把文档读入内存,并且可以根据自身需求来获取数据,而不必解析整个文档,缺点:需要自己编写事件逻辑,使用麻烦,并且不能同时访问文档中的不同部分.使用范围:对于较大的文档有较好的解析能力,所以适用大文档的解析

pull解析:自我感觉是sax的升级版,比sax好用多了,优点:你不必自己写事件逻辑,并且也不需要把文档读到内存,缺点:对文档进行修改较困难

ok,三种方式的优缺点及适用范围说明完毕,其实,任何一种解析方式肯定都可以解析xml,如果你愿意,你可以对任何xml文档都使用1种解析方式.下面具体说一下每种解析方式的用法

在解析之前,先把要解析的xml文档贴出来:

<note name="rqq">
    <to id="1">George</to>
    <from id="2">John</from>
    <heading id="3">Reminder</heading>
    <body id="4">Don't forget the meeting!</body>
</note>

1,dom解析:

因为document是一个接口,没有构造方法,所以不能采用new的方式来获取实例,只能通过相关类来获取实例,
查看dom解析的相关类,可以发现利用DocumentBuilder类可以获得一个document实例,但是DocumentBuilder类是一个抽象类,也不能采用new的方式获取DocumentBuilder对象,并且这个类也没有给出其他方式来获取实例,所以也只能通过相关类来获取实例,然后发现DocumentBuilder有个工厂类,即DocumentBuilderFactory,这个类提供了获取DocumentBuilder实例的方法,但是DocumentBuilderFactory这个类也是个抽象类,不过这个类提供了其他方法来获取自身的实例,即DocumentBuilderFactory.newInstance(),OK,通过以上方式我们拿到了document对象,代码表示出来就是:
ocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(is);

其实不只是dom解析,sax解析和pull解析都是不能直接new出实例的,都只能采用这种方式来获取解析实例,这应该是出于线程安全方面考虑,让程序自始至终只有一个解析实例.
OK,拿到document对象之后,就可以进行xml文档的解析工作,

因为dom解析的特点:把拿到的xml文档一次全部读到内存里,所以document肯定有个方法用来获取整个文档的所有信息的,即
 Element element = document.getDocumentElement();//获取当前xml文档的所有信息
 通过这个方法,我们又拿到一个element对象,这个element对象里就包含了所有的文档信息,所以element对象肯定提供了很多方法用来获取文档详细信息,下面用代码带一一展示:

    /**
     * dom解析,该方法里的代码演示了如何利用DOM解析,拿到该xml文档的所有信息,如根节点名称,属性,和该根节点包含的
     * 所有子节点的所有信息(子节点的属性,文本内容,子节点又包含的子节点等等)
     */
    public void DomParse(View view) {
        DocumentBuilderF
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值