源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

android操作XML的几种方法总结

  • 时间:2020-09-13 11:08 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:android操作XML的几种方法总结
XML作为一种业界公认的数据交换格式,在各个平台与语言之上,都有广泛使用和实现。其标准型,可靠性,安全性......毋庸置疑。在android平台上,我们要想实现数据存储和数据交换,经常会使用到xml数据格式和xml文件。 [b]小提示:[/b]android中存储数据一般有如下几种:SharedPreferences(参数化),XML文件,sqllite数据库,网络,ContentProvider(内容提供者)等。 在android中,操作xml文件,一般有几种方式:SAX操作,Pull操作,DOM操作等。其中DOM的方式,可能是大家最熟悉的,也是符合W3C标准的。 [b]1)[/b] 在java平台中,有诸如DOM4J这样优秀的开源包,极大程度的方便大家使用DOM标准来操作XML文件。在javascript中,不同的浏览器解析引擎,对DOM的解析和操作也略有差异(不过这不是本章介绍的重点)。而DOM的方式,也有其缺点。通常一次性加载xml文件,再使用DOM的 api去进行解析,这样很大程度的消耗内存,对性能会有一定影响。而我们的android手机,虽然配置在不断的升级,但是内存方面,暂时还无法与传统的PC去媲美。所以,在android上面,不太推荐使用DOM的方式来解析和操作XML。
[u]复制代码[/u] 代码如下:
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;   } }
[b]2)[/b] SAX(Simple API for XML),是一个使用非常广泛的XML解析标准,通常使用Handler模式来处理XML文档,这种处理模式和我们平常习惯的理解方式很不同,身边也经常有一些朋友在刚接触SAX的时候会觉得理解起来有些困难。其实SAX并不复杂,只不过是换了一种思维方式,正如它的名字所表示的,为了让我们以更简单的方式来处理XML文档,下面我们就开始吧。
[u]复制代码[/u] 代码如下:
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));      }      }  }    } }
[b]3)[/b] Pull解析和Sax解析很相似,都是轻量级的解析,在Android的内核中已经嵌入了Pull,所以我们不需要再添加第三方jar包来支持Pull。Pull解析和Sax解析不一样的地方有(1)pull读取xml文件后触发相应的事件调用方法返回的是数字(2)pull可以在程序中控制想解析到哪里就可以停止解析。
[u]复制代码[/u] 代码如下:
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类的代码:
[u]复制代码[/u] 代码如下:
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; } @Override public String toString() {  return "Person [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部