xml中三种解析方式介绍

1)dom: 文档对象模型(Document Object Model) 官方推荐的标准

 dom原理:会把我们要解析的整个xml加载到到内存中.在内存中形成一个树形结构
 优点:可以进行增删改查
 缺点:由于把整个文档加载到内存中.所以会造成内存泄露 

2)sax: 简单应用程序接口(Simple Api For Xml) 他不是官方推荐 是一个程序员社区研究出来

 特点:一边解析 一边处理 一边释放内存  
 优点:不会有内存泄露 
 缺点: 不能进行增 删 改

3)xmlpull解析:他是Android中内置的解析器,解析原理类似sax

1、dom解析实现

dom sax xmlpull只是三种解析的方式 或者说是解析的思想,他并没有提供相应的api实现
sun公司提供了一套接口jaxp Java API for XML Processing 实现了dom 和 sax解析
dom解析会形成一个树形结构 
dom解析把xml元素 属性 文本都当成是节点(node)
实现思路:通过工厂获取解析器的实例  拿到解析器的实例后解析xml  
具体实现步骤:
    //[1]定义工厂
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    //[2]通过工厂获取解析器
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
    //[3]开始解析xml  document代表整棵树
        Document document = documentBuilder.parse("bookstore.xml");
    //[4]获取我们想获取的内容
        NodeList elementsByTagNames = document.getElementsByTagName("name");
    //[5]循环取出集合中每个节点 
        for(int i=0;i<elementsByTagNames.getLength();i++){
    //[6]取出每个item5.
            Node item = elementsByTagNames.item(i);
            String content = item.getFirstChild().getTextContent();
    //[7]取出书的名字
            System.out.println("content:"+content);
        }

2、sax解析实现

dom特点把整个文档加载到内存 sax思想是一边解析一边处理一边释放内存
具体实现代码步骤如下
     //[1]构建工厂 
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        //[2]通过工厂获取sax解析器 
        SAXParser saxParser = saxParserFactory.newSAXParser();
        //[3]开始解析xml  第二个参数是事件的处理器 
        saxParser.parse("bookstore.xml", new MyDefaultHandler());
    }
    //定义事件的处理器
    class MyDefaultHandler extends DefaultHandler{
        //  接收文档开始的通知。
        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            System.out.println("文档开始");
        }
        // 接收元素开始的通知。
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);

            System.out.println("startElement");
        }
        //接收元素中字符(文本)数据的通知
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            super.characters(ch, start, length);
            String content = new String(ch, start, length);
            if (content!=null&&content.trim().length()>0) {

                System.out.println("characters--文本"+content);
            }
        }
        //接收元素结束的通知。
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            super.endElement(uri, localName, qName);
            System.out.println("endElement");
        }
        //接收文档结束的通知。
        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
            System.out.println("文档结束");
        }
    }

3、xmlpull解析的实现

原理:类似sax 一边解析 一边处理 它是Android内置的解析器
//代码的实现
[1]导入xmlpullparser相关的jar包
[2]具体的代码实现 
//[0]创建一个集合
    List<Book> lists = null;
    Book book = null;
    //[1]构建工厂 
    XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
    //[2]通过工厂获取 xmlpullparser解析器 
    XmlPullParser parser = xmlPullParserFactory.newPullParser();
    //[3]开始解析xml  arg1编码的方式
    parser.setInput(new FileInputStream("bookstore.xml"), "utf-8");
    //[4]获取解析的事件类型 
    int eventType = parser.getEventType();  //代表解析到了文档的开头   
    //[5]不到文件的结尾就一直解析 
    while(eventType!=XmlPullParser.END_DOCUMENT){
        switch (eventType) {
        case XmlPullParser.START_TAG:  //代表解析的开始标签
            //[6]具体判断一下解析到了哪个开始标签
            if("bookstore".equals(parser.getName())){
                //[7]创建list集合
                lists= new ArrayList<Book>();
            }else if("book".equals(parser.getName())){
                //[8]创建javabean对象
                book = new Book();
                //[9]获取id的属性 getAttributeValue 获取开始标签的一个属性值
                String id = parser.getAttributeValue(0);
                book.setId(id);                     
            }else if("name".equals(parser.getName())){
                //pull解析注意获取标签包裹的内容则是 使用 .NextText()
                //而不是使用getText();
                String name = parser.nextText();
                book.setName(name);                     
            }else if("price".equals(parser.getName())){
                String price = parser.nextText();
                book.setPrice(price);               

            }
            break;
        case XmlPullParser.END_TAG:  //代表解析的结束的标签
            if("book".equals(parser.getName())){
                //把book对象加入到list集合中
                lists.add(book);
            }
            break;
        }
        //获取下一个标签的类型
        eventType = parser.next();
        //[6]一直解析 

    }
    //最后一步 打印一下集合的信息 
    for (Book l : lists) {
        System.out.println("l~~~"+l);
    }
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值