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

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 + "]";}}

更多相关文章

  1. jscript和vbscript对XML元素属性进行操作的方法
  2. java通过XPath解析xml节点的代码详解
  3. 分享一个jscript与vbscript操作XML元素属性的方法
  4. C#中通过xpath查找xml的指定元素的代码实例
  5. 有关xml节点的文章推荐10篇
  6. 关于XML元素的10篇课程推荐
  7. Vue.js流程图插件 可自定义流程节点事件
  8. hadoop 3节点高可用分布式安装
  9. 【从0到1学习边缘容器系列-4】弱网环境利器之分布式节点状态判定

随机推荐

  1. Android api,Android SDK
  2. android后台进程隐藏手段
  3. ch026 Android Socket
  4. Uyghur Android
  5. android的布局练习
  6. Fragment 中的onConfigurationChanged 在
  7. android中重要的知识点
  8. android访问SD卡的权限
  9. android 选中效果xml文件
  10. android 设置主页面的方式