文档章节

android xml解析

 专注移动开发
发布于 2015/06/25 13:38
字数 1065
阅读 18
收藏 0

Android解析XML

         在Android平台上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器解析XML文件。

        下面是本例子要解析的XML文件:itcast.xml

复制代码

李明
30


李向梅
25

复制代码

        例子定义了一个javabean用于存放上面解析出来的xml内容, 这个javabean为Person,代码:

复制代码

  Person {

     Integer id;
     String name;
 Short age;

     Integer getId() {
         id;
    }

      setId(Integer id) {
        .id = id;
    }

     String getName() {
         name;
    }

      setName(String name) {
        .name = name;
}

     Short getAge() {
         age;
    }

      setAge(Short age) {
        .age = age;
    }
}

复制代码

 

1. SAX解析XML文件

        SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。

 

复制代码

  List<Person> readXML(InputStream inStream) {
    {
                        SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser saxParser = spf.newSAXParser();
 
                        saxParser.setProperty("http://xml.org/sax/features/namespaces",);
            XMLContentHandler handler =  XMLContentHandler();
            saxParser.parse(inStream, handler);
            inStream.close();

             handler.getPersons();
   }  (Exception e) {
            e.printStackTrace();
   }

   ;
}

 
  XMLContentHandler  DefaultHandler {

             List<Person> persons = ;
             Person currentPerson;
             String tagName = ;
              List<Person> getPersons() {
                         persons;
            }
 
                        @Override
              startDocument()  SAXException {
                        persons =  ArrayList<Person>();
            }

                         @Override
              startElement(String namespaceURI, String localName, String qName, Attributes atts)  SAXException {

                        (localName.equals("person")){
                                    currentPerson =  Person();
                                    currentPerson.setId(Integer.parseInt(atts.getValue("id")));
                        }

                        .tagName = localName;
            }
 
                        @Override
              characters([] ch,  start,  length)  SAXException {

                        (tagName!=){
                                    String data =  String(ch, start, length);
                                    (tagName.equals("name")){
                                                .currentPerson.setName(data);
                                    } (tagName.equals("age")){
                                                .currentPerson.setAge(Short.parseShort(data));
                                    }
                        }
            }

                         @Override
              endElement(String uri, String localName, String name)  SAXException {

                        (localName.equals("person")){
                                    persons.add(currentPerson);
                                    currentPerson = ;
                        }

                        .tagName = ;
            }
}

复制代码

 

2. DOM解析XML文件

     DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。

复制代码

  List<Person> readXML(InputStream inStream) {

            List<Person> persons =  ArrayList<Person>();

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

             {
                        DocumentBuilder builder = factory.newDocumentBuilder();
                        Document dom = builder.parse(inStream);

                        Element root = dom.getDocumentElement();

                        NodeList items = root.getElementsByTagName("person");
                         ( i = 0; i < items.getLength(); i++) {
                                    Person person =  Person();

                                                                        Element personNode = (Element) items.item(i);

                                                                        person.setId( Integer(personNode.getAttribute("id")));

                                                                        NodeList childsNodes = personNode.getChildNodes();

                                     ( j = 0; j < childsNodes.getLength(); j++) {
                                                Node node = (Node) childsNodes.item(j); 
                                                (node.getNodeType() == Node.ELEMENT_NODE){   
                                                            Element childNode = (Element) node;

                                                                                                                     ("name".equals(childNode.getNodeName())) {
                                                                                                                                               person.setName(childNode.getFirstChild().getNodeValue());                                                                               }   (“age”.equals(childNode.getNodeName())) {
                                                                        person.setAge( Short(childNode.getFirstChild().getNodeValue()));
                                                            }
                                                }
                                    }

                                    persons.add(person);
                        }

                        inStream.close();
            }  (Exception e) {
                        e.printStackTrace();
            }

             persons;
}

复制代码

 

3.Pull解析器解析XML文件

         Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。

复制代码

  List<Person> readXML(InputStream inStream) {

            XmlPullParser parser = Xml.newPullParser();

             {
                        parser.setInput(inStream, "UTF-8");
                         eventType = parser.getEventType();

                        Person currentPerson = ;
                        List<Person> persons = ;

                         (eventType != XmlPullParser.END_DOCUMENT) {
                                     (eventType) {
                                     XmlPullParser.START_DOCUMENT:                                                persons =  ArrayList<Person>();
                                                ;

                                      XmlPullParser.START_TAG:                                                String name = parser.getName();
                                                 (name.equalsIgnoreCase("person")) {
                                                            currentPerson =  Person();
                                                            currentPerson.setId( Integer(parser.getAttributeValue(, "id")));
                                                }   (currentPerson != ) {
                                                             (name.equalsIgnoreCase("name")) {
                                                                        currentPerson.setName(parser.nextText());                                                            }   (name.equalsIgnoreCase("age")) {
                                                                        currentPerson.setAge( Short(parser.nextText()));
                                                            }
                                                }
                                                ;
 
                                     XmlPullParser.END_TAG:                                                 (parser.getName().equalsIgnoreCase("person") && currentPerson != ) {
                                                            persons.add(currentPerson);
                                                            currentPerson = ;
                                                }

                                                ;
                                    }

                                     eventType = parser.next();
                        }

            inStream.close();
             persons;
            }  (Exception e) {
                        e.printStackTrace();
            }

             ;
}

 
  String writeXML(List<Person> persons, Writer writer){

    XmlSerializer serializer = Xml.newSerializer();

     {
        serializer.setOutput(writer);
        serializer.startDocument("UTF-8", );

                serializer.startTag("", "persons");

         (Person person : persons){
            serializer.startTag("", "person");
            serializer.attribute("", "id", person.getId().toString());
            serializer.startTag("", "name");
            serializer.text(person.getName());
            serializer.endTag("", "name");
            serializer.startTag("", "age");
            serializer.text(person.getAge().toString());
            serializer.endTag("", "age");
            serializer.endTag("", "person");
        }

        serializer.endTag("", "persons");
        serializer.endDocument();

         writer.toString();
    }  (Exception e) {
        e.printStackTrace();
    }

     ;
}

 

File xmlFile =  File("myitcast.xml");
FileOutputStream outStream =  FileOutputStream(xmlFile);
OutputStreamWriter outStreamWriter =  OutputStreamWriter(outStream, "UTF-8");
BufferedWriter writer =  BufferedWriter(outStreamWriter);

writeXML(persons, writer);
writer.flush();
writer.close();

 
StringWriter writer =  StringWriter();
writeXML(persons, writer);
String content = writer.toString();

复制代码

 

 4.SAX和PULL使用

    区别为:SAX解析器的工作方式是自动将事件推入事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。
    你随便找个sax和pull的例子比较一下就可以发现,pull是一个while循环,随时可以跳出,而sax不是,sax是只要解析了,就必须解析完成。


本文转载自:http://www.cnblogs.com/devinzhang/archive/2012/01/16/2323668.html

共有 人打赏支持
上一篇: android 设计模式
下一篇: java 线程详解
粉丝 3
博文 48
码字总数 3957
作品 0
杭州
技术主管
私信 提问
Android开发进阶(五)--使用原始的XML文件

应用场景 在Android应用开发过程中,有时候我们自己有一些XML文件是我们自己手动创建的,而在项目开发过程中可能会用到,也就是说这用到了原始的XML资源文件。这个XML原始资源文件我们可以通...

程序袁_绪龙
2015/01/07
0
0
在 Android 3.0 平台上创建和解析 XML

简介: Android 是最常用的智能手机平台,它在移动平板电脑上也能发挥作用。XML 是数据交换的标准媒介。您可以对标准 XML 解析、标准 XML 转换和 Android 使用相同的生成器、解析器和转换器 ...

IBMdW
2011/11/14
665
0
Android读写XML(上)

注明:本文转自http://www.moandroid.com. 原文地址: http://www.moandroid.com/?p=508 XML 经常用作 Internet 上的一种数据格式,其文件格式想必大家都比较清楚,在这里我结合Android平台,...

晨曦之光
2012/03/01
391
0
android 中xml解析方式

XML在各种开发中都广泛应用,Android也不例外。作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建...

指尖上的开源
2015/01/19
0
0
Android 创建与解析XML(一)—— 概述

Android 是最常用的智能手机平台,XML 是数据交换的标准媒介,Android 中可以使用标准的XML生成器、解析器、转换器 API,对 XML 进行解析和转换。 XML,相关有DOM、SAX、JDOM、DOM4J、Xerce...

长平狐
2013/01/06
159
0

没有更多内容

加载失败,请刷新页面

加载更多

听说拼多多因漏洞被薅了200亿?- 谈谈软件测试

昨天看到一个大新闻:拼多多在20日凌晨出现漏洞,用户可以领100元无门槛优惠券。一夜之间,被黑产、羊毛党和闻讯而来的吃瓜群众薅了个底朝天,直到第二天上午9点才将优惠券下架。网上传言这一...

crossin
30分钟前
2
0
微服务架构有毒,何时不使用微服务?

在过去的四年中,使用微服务来构建应用程序似乎成了一种标准。大多数我所合作过的团队也对此表现出了不同程度的兴趣。 微服务所承诺的弹性、高可用、低耦合、敏捷,以及能够解决单体架构带来...

架构师springboot
35分钟前
2
0
日志服务Python消费组实战(三):实时跨域监测多日志库数据

摘要: 本文主要介绍如何使用消费组实时监控多个域中的多个日志库中的异常数据,并进行下一步告警动作。具备配置简单、逻辑灵活、支持跨域多Region、实时监测,无需配置索引等特点,并且性能...

阿里云云栖社区
36分钟前
2
0
常用css动效

1.列表浮层变化动效 demo地址 下载地址 2.js动画库 github地址 3.滚动加载 Scrollreveal 4.其他动效 tobiasahlin

chinahufei
37分钟前
3
0
Coding and Paper Letter(四十六)

资源整理。 1 Coding: 1.卫星影像深度学习资源。 satellite image deep learning 2.runoff tools为MOM生成径流文件的一些工具变得轻而易举。 runoff tools 3.NOAA-GFDL海冰模拟器V2.0。 SIS2...

胖胖雕
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部