文档章节

android xml解析

 专注移动开发
发布于 2015/06/25 13:38
字数 1065
阅读 16
收藏 0
点赞 0
评论 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

共有 人打赏支持
粉丝 3
博文 46
码字总数 3793
作品 0
杭州
技术主管
Android开发进阶(五)--使用原始的XML文件

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

程序袁_绪龙
2015/01/07
0
0
android 中xml解析方式

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

指尖上的开源
2015/01/19
0
0
Android Pull 解析 XML

Pull 解析和 Sax 解析很相似,都是轻量级的解析。在 Android 的内核中已经嵌入了 Pull,所以我们不需要再添加第三方 jar 包来支持 Pull。 Pull 解析和 Sax 解析不一样的地方有: 1)Pull 读取...

gavin_jin
2012/03/05
0
0
Android之SAX解析xml

SAX全称simple API for XML,同DOM一样也是一个访问XML文档的接口。SAX并不是一个实际可以直接对XML进行解析的解析器,而是他兼容SAX的解析器要实现的接口帮助类的集合。实现了SAX的解析器有很...

哈全文
2012/05/21
0
0
Android四款系统架构工具

Spring for Android   Spring for Android是Spring框架在Android平台上的扩展,旨在简化Android原生应用的开发流程,提高开发者的工作效率。Spring for Android可以帮助开发者简化应用与服...

zhwj407906450
2014/10/21
0
0
android客户端访问服务端tomcat

首先,服务器端已经存在一个项目,该项目基于SSH,已经部署在tomcat上并且正在运行了.我在这个项目的action层新建了一个包,该包主要是Struts2的一些action,只是这些action不是返回某些view,而是...

蜡笔小小小新
2015/11/11
0
0
Android学习之JSON数据解析

在Android应用开发中,常用的数据交换格式有XML和JSON,这两种方式各有各的好处,我们在特定的应用开发中可以选择合适的一种。下面来看一下JOSN数据解析: 例子永远是最好的教程,下面我们来...

wustrive_2008
2011/06/30
0
0
基于Android移动平台僵尸网络模拟工具设计与实现

移动端:基于Android系统开发的应用,表层应用是基于baiduMap 路线规划app 服务端:基于python web 开发框架 django 实现。 通信信道:基于第三方SDK Jpush推送消息+自己一套加密系统 推送原...

颓废的幻想者
2015/06/29
0
0
《android用SAX解析xml》

主要的Acivity package com.xml.xml;import java.io.Serializable;import java.util.ArrayList;import java.util.List;import java.util.Map;import javax.xml.parsers.SAXParserFactory;imp......

吕檀溪
2014/04/01
0
0
Android 使用LayoutInflater.Factory2创建布局

一,解析LayoutInflater运行原理 从创建一个LayoutInflater的方式我们可以知道,LayoutInflater是系统提供的单例对象 LayoutInflater layoutInflater = getLayoutInflater();↓LayoutInfla...

IamOkay
2015/04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
22分钟前
0
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
29分钟前
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
33分钟前
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
36分钟前
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
0
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
1
0
iptables规则备份和恢复、firewalld的9个zone以及操作和service的操作

保存以及备份iptalbes规则 设定了的防火墙规则要进行保存,否则系统重启后这些规则就没有了,使用命令 ”service iptables save ” 会把设定好的防火墙规则保存到文件/etc/sysconfig/iptabl...

黄昏残影
昨天
0
0
k8s image

k8s.gcr.io/kube-apiserver-amd64:v1.11.0k8s.gcr.io/kube-controller-manager-amd64:v1.11.0k8s.gcr.io/kube-scheduler-amd64:v1.11.0k8s.gcr.io/kube-proxy-amd64:v1.11.0k8s.gcr.......

分秒
昨天
0
0
数据结构--排序

这篇博客包含了数据结构中多种的排序算法: (1)简单选择:第一趟在A[0]~A[n-1]之间找到最小的,与A[0]进行交换,之后在A[1]~A[n-1]之间进行。。。第i趟在A[i-1]~A[n-1]之间找到最小的,最后...

wangxuwei
昨天
1
0
一名3年工作经验的java程序员应该具备的职业技能

一名3年工作经验的Java程序员应该具备的技能,这可能是Java程序员们比较关心的内容。我这里要说明一下,以下列举的内容不是都要会的东西—-但是如果你掌握得越多,最终能得到的评价、拿到的薪...

老道士
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部