android操作XML的几种方式

来源:互联网 发布:mac 手绘 编辑:程序博客网 时间:2024/05/29 16:23

XML作为一种业界公认的数据交换格式,在各个平台与语言之上,都有广泛使用和实现。其标准型,可靠性,安全性......毋庸置疑。在android平台上,我们要想实现数据存储和数据交换,经常会使用到xml数据格式和xml文件。

小提示:android中存储数据一般有如下几种:SharedPreferences(参数化),XML文件,sqllite数据库,网络,ContentProvider(内容提供者)等。

 

在android中,操作xml文件,一般有几种方式:SAX操作,Pull操作,DOM操作等。其中DOM的方式,可能是大家最熟悉的,也是符合W3C标准的。

1)

在java平台中,有诸如DOM4J这样优秀的开源包,极大程度的方便大家使用DOM标准来操作XML文件。在javascript中,不同的浏览器解析引擎,对DOM的解析和操作也略有差异(不过这不是本章介绍的重点)。而DOM的方式,也有其缺点。通常一次性加载xml文件,再使用DOM的 api去进行解析,这样很大程度的消耗内存,对性能会有一定影响。而我们的android手机,虽然配置在不断的升级,但是内存方面,暂时还无法与传统的PC去媲美。所以,在android开发中,个人不太推荐使用DOM的方式来解析和操作XML。

package cn.itcast.service;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import cn.itcast.model.Person;public class DomPersonService {     public List<Person> getPersons(InputStream stream) throws Throwable     {         List<Person> list =new ArrayList<Person>();         DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();         DocumentBuilder builder =factory.newDocumentBuilder();        Document dom = builder.parse(stream);//解析完成,并以dom树的方式存放在内存中。比较消耗性能         //开始使用dom的api去解析         Element root = dom.getDocumentElement();//根元素        NodeList personNodes = root.getElementsByTagName("person");//返回所有的person元素节点        //开始遍历啦        for(int i=0;i<personNodes.getLength();i++)        {            Person person =new Person();        Element personElement =(Element)personNodes.item(i);          person.setId(new Integer( personElement.getAttribute("id")));//将person元素节点的属性节点id的值,赋给person对象          NodeList personChildrenNodes =personElement.getChildNodes();//获取person节点的所有子节点          //遍历所有子节点          for(int j=0;j<personChildrenNodes.getLength();j++)          {              //判断子节点是否是元素节点(如果是文本节点,可能是空白文本,不处理)              if(personChildrenNodes.item(j).getNodeType()==Node.ELEMENT_NODE)              {                  //子节点--元素节点                  Element childNode =(Element)personChildrenNodes.item(j);                  if("name".equals(childNode.getNodeName()))                  {                      //如果子节点的名称是“name”.将子元素节点的第一个子节点的值赋给person对象                      person.setName(childNode.getFirstChild().getNodeValue());                                        }else if("age".equals(childNode.getNodeValue()))                  {                       person.setAge(new Integer(childNode.getFirstChild().getNodeValue()));                  }              }                        }          list.add(person);        }        return list;     }}

2)

SAX(Simple API for XML),是一个使用非常广泛的XML解析标准,通常使用Handler模式来处理XML文档,这种处理模式和我们平常习惯的理解方式很不同,身边也经常有一些朋友在刚接触SAX的时候会觉得理解起来有些困难。其实SAX并不复杂,只不过是换了一种思维方式,正如它的名字所表示的,为了让我们以更简单的方式来处理XML文档,下面我们就开始吧。

package cn.itcast.service;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import cn.itcast.model.Person;public class SAXPersonService {   public List<Person> getPersons(InputStream inStream) throws Throwable   {       SAXParserFactory factory = SAXParserFactory.newInstance();//工厂模式还是单例模式?       SAXParser parser =factory.newSAXParser();       PersonParse personParser =new PersonParse();       parser.parse(inStream, personParser);       inStream.close();       return personParser.getPerson();   }   private final class PersonParse extends DefaultHandler   {           private List<Person> list = null;    Person person =null;    private String tag=null;        public List<Person> getPerson() {        return list;    }    @Override    public void startDocument() throws SAXException {        list =new ArrayList<Person>();    }    @Override    public void startElement(String uri, String localName, String qName,            Attributes attributes) throws SAXException {        if("person".equals(localName))        {            //xml元素节点开始时触发,是“person”            person = new Person();            person.setId(new Integer(attributes.getValue(0)));        }        tag =localName;//保存元素节点名称    }    @Override    public void endElement(String uri, String localName, String qName)            throws SAXException {        //元素节点结束时触发,是“person”        if("person".equals(localName))        {            list.add(person);            person=null;        }        tag =null;//结束时,需要清空tag        }    @Override    public void characters(char[] ch, int start, int length)            throws SAXException {        if(tag!=null)        {            String data = new String(ch,start,length);           if("name".equals(tag))           {               person.setName(data);                          }else if("age".equals(tag))           {               person.setAge(new Integer(data));           }        }    }                         }}

3)

 Pull解析和Sax解析很相似,都是轻量级的解析,在Android的内核中已经嵌入了Pull,所以我们不需要再添加第三方jar包来支持Pull。Pull解析和Sax解析不一样的地方有(1)pull读取xml文件后触发相应的事件调用方法返回的是数字(2)pull可以在程序中控制想解析到哪里就可以停止解析。

package cn.itcast.service;import java.io.InputStream;import java.io.Writer;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlSerializer;import android.util.Xml;import cn.itcast.model.Person;public class PullPersonService {    //保存xml文件    public static void saveXML(List<Person> list,Writer write)throws Throwable    {        XmlSerializer serializer =Xml.newSerializer();//序列化        serializer.setOutput(write);//输出流        serializer.startDocument("UTF-8", true);//开始文档        serializer.startTag(null, "persons");        //循环去添加person        for (Person person : list) {            serializer.startTag(null, "person");            serializer.attribute(null, "id", person.getId().toString());//设置id属性及属性值            serializer.startTag(null, "name");            serializer.text(person.getName());//文本节点的文本值--name            serializer.endTag(null, "name");            serializer.startTag(null, "age");            serializer.text(person.getAge().toString());//文本节点的文本值--age            serializer.endTag(null, "age");            serializer.endTag(null, "person");        }        serializer.endTag(null, "persons");        serializer.endDocument();        write.flush();        write.close();    }     public List<Person> getPersons(InputStream stream) throws Throwable     {         List<Person> list =null;        Person person =null;        XmlPullParser parser =Xml.newPullParser();        parser.setInput(stream,"UTF-8");        int type =parser.getEventType();//产生第一个事件        //只要当前事件类型不是”结束文档“,就去循环        while(type!=XmlPullParser.END_DOCUMENT)        {        switch (type) {        case XmlPullParser.START_DOCUMENT:        list =    new ArrayList<Person>();            break;        case XmlPullParser.START_TAG:            String name=parser.getName();//获取解析器当前指向的元素名称            if("person".equals(name))            {                person =new Person();                person.setId(new Integer(parser.getAttributeValue(0)));            }            if(person!=null)            {                if("name".equals(name))                {                    person.setName(parser.nextText());//获取解析器当前指向的元素的下一个文本节点的文本值                }                if("age".equals(name))                {                    person.setAge(new Integer(parser.nextText()));                }            }            break;        case XmlPullParser.END_TAG:            if("person".equals(parser.getName()))            {                list.add(person);                person=null;            }            break;        }        type=parser.next();//这句千万别忘了哦        }         return list;     }}

下面是Model层的Person类的代码:

package cn.itcast.model;public class Person {private Integer id;public Integer getId() {    return id;}public void setId(Integer id) {    this.id = id;}private String name;public String getName() {    return name;}public void setName(String name) {    this.name = name;}private Integer age;public Integer getAge() {    return age;}public void setAge(Integer age) {    this.age = age;}public Person(){}public Person(Integer id, String name, Integer age) {        this.id = id;    this.name = name;    this.age = age;}@Overridepublic String toString() {    return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";}}

看完本文中的示例,相信你已经理解了android中访问和操作xml数据的几种方式。读者不妨动手去敲代码、调试,可以很方便的利用模拟器进行单元测试。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 遇假记者敲诈怎么办 液氮挥发太快怎么办 高铁上空调太冷怎么办 文登市昆嵛酒店怎么办 厦漳泉同城包怎么办 亲戚朋友总是蹭吃蹭喝怎么办啊 开车上班总有蹭车的怎么办 食堂的饭难吃怎么办 租亲戚的房子怎么办 饭菜罩子生虫怎么办 食堂吃出虫子怎么办 缺氧没有煤炭了怎么办 缺氧没有金属了怎么办 白色衣服带红色怎么办 如果买方退回假货怎么办 饰品氧化变黑了怎么办 银放久了变黄怎么办 真银变色了怎么办 古装头饰变色了怎么办 液晶电视遥控器坏了怎么办 纯银手镯发黑怎么办 银色项链黑了怎么办 线切割割铜割不动怎么办 楼房一直不动工怎么办 买火车票待审核怎么办 太原动车月票怎么办 发票上没有日期怎么办 火车没有坐票怎么办 如果买到无座的火车票怎么办 动车票来不及去怎么办 火车票被洗了怎么办 进站后走错站台怎么办 高铁票迟到了怎么办 12306生日错了怎么办 账号未通过核验怎么办 高铁票购票失败怎么办 天际线没有人口需求怎么办 复兴号 锁 区间 怎么办 地板砖上铺木地板门怎么办 高考座位号没涂该怎么办 一个人带小孩很累很烦怎么办