XML文档解析几种方式

解析XML文档的三种方式:dom解析,sax解析,pull解析。

dom解析

概述:全称document object model(文档对象模型) 文档:指的是标记型文档(html、xml);对象:在对象里面有属性和方法;使用dom里面提供的对象里面的属性和方法,对标记型文档进行操作。dom解析常用于JavaWeb中的xml文档解析。
dom解析优缺点:
  • 优点:根据xml文档的结构,在内存中分配了一个树形结构,因为是树形结构,很方便增加,修改,删除的操作。
  • 缺点:如果解析的文档过大,一次性在内存中分配一个树形结构,容易造成内存溢出。

sax解析

概述:全称Simple API for XML,既是一种接口,也是一种软件包。它是一种XML解析的替代方法。SAX不同于DOM解析,它逐行扫描文档,一边扫描一边解析,当读到特定的标签时候,自动调用相应的方法进行操作。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。sax解析用于android中的xml文档解析。
sax解析优缺点:
  • 优点:由于解析方式是边读边解析,不会造成内存的溢出。
  • 缺点:不能实现增加,修改,删除的操作。

pull解析

概述:pull解析和sax解析的原理一样,pull解析xml文件把xml中的内容放到集合里面。不一样的是pullpull读取xml文件后调用方法返回的是数字:

读取到xml的声明返回数字0 START_DOCUMENT;
读取到xml的结束返回数字1 END_DOCUMENT
读取到xml的开始标签返回数字2 START_TAG
读取到xml的结束标签返回数字3 END_TAG
读取到xml的文本返回数字4 TEXT

pull解析常用于Android中的xml文件解析。也可脱离Android独自使用,由于我是搞Android开发的,这个就写的详细一点了。
代码:

person.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <student id="1">
        <name>张三</name>
        <sex></sex>
        <age>18</age>
    </student>
    <student id="2">
        <name>李四</name>
        <sex></sex>
        <age>20</age>
    </student>
</root>

PullPerson.java

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

public class PullPerson {

    /**
     * @author Listener_Gao
     * @param args
     */
    public static void main(String[] args) {
        //person.xml文档在项目的src目录下
        String path = "src/person.xml";
        List<Person> list = null;
        try {
            list = pullParserXml(path);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //遍历集合
        for (Person p : list) {
            System.out.println(p);
        }

    }
    /**
     * pull解析person.xml文件,把解析到的文件放到集合中
     * @return List<Person> 返回list集合
     * @param  filePath   xml文件的路径  
     */
    public static List<Person> pullParserXml(String filePath) throws Exception {

        //创建解析器工厂 对象
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        //使用解析器工厂对象  创建解析器
        XmlPullParser parser = factory.newPullParser();
        //把要操作的文件放到解析器中
        parser.setInput(new FileInputStream(filePath), "utf-8");

        /***************************开始解析xml文档************************/
        List<Person> list = null;
        Person p = null;
        //获取标签的类型
        int typeEvent = 0; //parser.getEventType();
        //如果没有读到结束的标签就一直循环
        while((typeEvent = parser.getEventType()) != XmlPullParser.END_DOCUMENT) {
            //得到当前解析到的标签的名称
            String tagName = parser.getName();
            /**
             * 1,解析到root,创建list集合
             * 2,解析到student,创建Person对象
             * 3,解析到name,sex,age内容是,过去标签的内容
             * 4,将标签的内容添加到person对象中
             */
            switch(typeEvent) {
            case XmlPullParser.START_TAG:
                if("root".equals(tagName)) {
                    //解析到root,创建list集合
                    list = new ArrayList<>();
                }else if("student".equals(tagName)) {
                    //解析到student,创建Person对象
                    p = new Person();
                    //读取student标签中的id属性
                    int id = Integer.parseInt(parser.getAttributeValue(0));
                    //将id的值放到person对象中
                    p.setId(id);
                    //简写成一步
                    //p.setId(Integer.parseInt(parser.getAttributeValue(0)));
                }else if ("name".equals(tagName)) {
                    //得到标签的值
                    String name = parser.nextText();
                    //将得到的name的值放person对象中
                    p.setName(name);
                }else if ("sex".equals(tagName)) {
                    p.setSex(parser.nextText());
                }else if ("age".equals(tagName)) {
                    p.setAge(Integer.parseInt(parser.nextText()));
                }
                break;

            case XmlPullParser.END_TAG:
                //当解析到结束标签的root时,将对象添加到list集合中
                if("student".equals(tagName)) {
                    list.add(p);
                    //p = null;
                }
                break;
            }
            //继续执行
            parser.next();
        }
        return list;
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值