• android操作XML的几种方式(转)


    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。

    [csharp] view plaincopy
    1. package cn.itcast.service;  
    2.   
    3. import java.io.InputStream;  
    4. import java.util.ArrayList;  
    5. import java.util.List;  
    6.   
    7. import javax.xml.parsers.DocumentBuilder;  
    8. import javax.xml.parsers.DocumentBuilderFactory;  
    9.   
    10. import org.w3c.dom.Document;  
    11. import org.w3c.dom.Element;  
    12. import org.w3c.dom.Node;  
    13. import org.w3c.dom.NodeList;  
    14.   
    15. import cn.itcast.model.Person;  
    16.   
    17. public class DomPersonService {  
    18.   
    19.      public List<Person> getPersons(InputStream stream) throws Throwable  
    20.      {  
    21.          List<Person> list =new ArrayList<Person>();  
    22.          DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();  
    23.          DocumentBuilder builder =factory.newDocumentBuilder();  
    24.         Document dom = builder.parse(stream);//解析完成,并以dom树的方式存放在内存中。比较消耗性能  
    25.          //开始使用dom的api去解析  
    26.          Element root = dom.getDocumentElement();//根元素  
    27.         NodeList personNodes = root.getElementsByTagName("person");//返回所有的person元素节点  
    28.         //开始遍历啦  
    29.         for(int i=0;i<personNodes.getLength();i++)  
    30.         {  
    31.             Person person =new Person();  
    32.         Element personElement =(Element)personNodes.item(i);  
    33.           person.setId(new Integer( personElement.getAttribute("id")));//将person元素节点的属性节点id的值,赋给person对象  
    34.           NodeList personChildrenNodes =personElement.getChildNodes();//获取person节点的所有子节点  
    35.           //遍历所有子节点  
    36.           for(int j=0;j<personChildrenNodes.getLength();j++)  
    37.           {  
    38.               //判断子节点是否是元素节点(如果是文本节点,可能是空白文本,不处理)  
    39.               if(personChildrenNodes.item(j).getNodeType()==Node.ELEMENT_NODE)  
    40.               {  
    41.                   //子节点--元素节点  
    42.                   Element childNode =(Element)personChildrenNodes.item(j);  
    43.                   if("name".equals(childNode.getNodeName()))  
    44.                   {  
    45.                       //如果子节点的名称是“name”.将子元素节点的第一个子节点的值赋给person对象  
    46.                       person.setName(childNode.getFirstChild().getNodeValue());  
    47.                         
    48.                   }else if("age".equals(childNode.getNodeValue()))  
    49.                   {   
    50.                       person.setAge(new Integer(childNode.getFirstChild().getNodeValue()));  
    51.                   }  
    52.               }  
    53.                 
    54.           }  
    55.           list.add(person);  
    56.         }  
    57.         return list;  
    58.      }  
    59. }  



    2)

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

    1. package cn.itcast.service;  
    2.   
    3. import java.io.InputStream;  
    4. import java.util.ArrayList;  
    5. import java.util.List;  
    6.   
    7. import javax.xml.parsers.SAXParser;  
    8. import javax.xml.parsers.SAXParserFactory;  
    9.   
    10. import org.xml.sax.Attributes;  
    11. import org.xml.sax.SAXException;  
    12. import org.xml.sax.helpers.DefaultHandler;  
    13.   
    14. import cn.itcast.model.Person;  
    15.   
    16. public class SAXPersonService {  
    17.    public List<Person> getPersons(InputStream inStream) throws Throwable  
    18.    {  
    19.        SAXParserFactory factory = SAXParserFactory.newInstance();//工厂模式还是单例模式?  
    20.        SAXParser parser =factory.newSAXParser();  
    21.        PersonParse personParser =new PersonParse();  
    22.        parser.parse(inStream, personParser);  
    23.        inStream.close();  
    24.        return personParser.getPerson();  
    25.    }  
    26.    private final class PersonParse extends DefaultHandler  
    27.    {  
    28.      
    29.       
    30.     private List<Person> list = null;  
    31.     Person person =null;  
    32.     private String tag=null;  
    33.       
    34.     public List<Person> getPerson() {  
    35.         return list;  
    36.     }  
    37.     @Override  
    38.     public void startDocument() throws SAXException {  
    39.         list =new ArrayList<Person>();  
    40.     }  
    41.   
    42.     @Override  
    43.     public void startElement(String uri, String localName, String qName,  
    44.             Attributes attributes) throws SAXException {  
    45.         if("person".equals(localName))  
    46.         {  
    47.             //xml元素节点开始时触发,是“person”  
    48.             person = new Person();  
    49.             person.setId(new Integer(attributes.getValue(0)));  
    50.         }  
    51.         tag =localName;//保存元素节点名称  
    52.     }  
    53.     @Override  
    54.     public void endElement(String uri, String localName, String qName)  
    55.             throws SAXException {  
    56.         //元素节点结束时触发,是“person”  
    57.         if("person".equals(localName))  
    58.         {  
    59.             list.add(person);  
    60.             person=null;  
    61.         }  
    62.         tag =null;//结束时,需要清空tag  
    63.         }  
    64.     @Override  
    65.     public void characters(char[] ch, int start, int length)  
    66.             throws SAXException {  
    67.         if(tag!=null)  
    68.         {  
    69.             String data = new String(ch,start,length);  
    70.            if("name".equals(tag))  
    71.            {  
    72.                person.setName(data);  
    73.                  
    74.            }else if("age".equals(tag))  
    75.            {  
    76.                person.setAge(new Integer(data));  
    77.            }  
    78.         }  
    79.     }  
    80.   
    81.       
    82.   
    83.       
    84.          
    85.          
    86.    }  
    87. }  


    3)

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

    1. package cn.itcast.service;  
    2.   
    3. import java.io.InputStream;  
    4. import java.io.Writer;  
    5. import java.util.ArrayList;  
    6. import java.util.List;  
    7.   
    8. import org.xmlpull.v1.XmlPullParser;  
    9. import org.xmlpull.v1.XmlSerializer;  
    10.   
    11. import android.util.Xml;  
    12.   
    13. import cn.itcast.model.Person;  
    14.   
    15. public class PullPersonService {  
    16.     //保存xml文件  
    17.     public static void saveXML(List<Person> list,Writer write)throws Throwable  
    18.     {  
    19.         XmlSerializer serializer =Xml.newSerializer();//序列化  
    20.         serializer.setOutput(write);//输出流  
    21.         serializer.startDocument("UTF-8", true);//开始文档  
    22.         serializer.startTag(null, "persons");  
    23.         //循环去添加person  
    24.         for (Person person : list) {  
    25.             serializer.startTag(null, "person");  
    26.             serializer.attribute(null, "id", person.getId().toString());//设置id属性及属性值  
    27.             serializer.startTag(null, "name");  
    28.             serializer.text(person.getName());//文本节点的文本值--name  
    29.             serializer.endTag(null, "name");  
    30.             serializer.startTag(null, "age");  
    31.             serializer.text(person.getAge().toString());//文本节点的文本值--age  
    32.             serializer.endTag(null, "age");  
    33.             serializer.endTag(null, "person");  
    34.         }  
    35.         serializer.endTag(null, "persons");  
    36.         serializer.endDocument();  
    37.         write.flush();  
    38.         write.close();  
    39.     }  
    40.      public List<Person> getPersons(InputStream stream) throws Throwable  
    41.      {  
    42.          List<Person> list =null;  
    43.         Person person =null;  
    44.         XmlPullParser parser =Xml.newPullParser();  
    45.         parser.setInput(stream,"UTF-8");  
    46.         int type =parser.getEventType();//产生第一个事件  
    47.         //只要当前事件类型不是”结束文档“,就去循环  
    48.         while(type!=XmlPullParser.END_DOCUMENT)  
    49.         {  
    50.         switch (type) {  
    51.         case XmlPullParser.START_DOCUMENT:  
    52.         list =  new ArrayList<Person>();  
    53.             break;  
    54.   
    55.         case XmlPullParser.START_TAG:  
    56.             String name=parser.getName();//获取解析器当前指向的元素名称  
    57.             if("person".equals(name))  
    58.             {  
    59.                 person =new Person();  
    60.                 person.setId(new Integer(parser.getAttributeValue(0)));  
    61.             }  
    62.             if(person!=null)  
    63.             {  
    64.                 if("name".equals(name))  
    65.                 {  
    66.                     person.setName(parser.nextText());//获取解析器当前指向的元素的下一个文本节点的文本值  
    67.                 }  
    68.                 if("age".equals(name))  
    69.                 {  
    70.                     person.setAge(new Integer(parser.nextText()));  
    71.                 }  
    72.             }  
    73.             break;  
    74.         case XmlPullParser.END_TAG:  
    75.             if("person".equals(parser.getName()))  
    76.             {  
    77.                 list.add(person);  
    78.                 person=null;  
    79.             }  
    80.             break;  
    81.         }  
    82.         type=parser.next();//这句千万别忘了哦  
    83.         }  
    84.          return list;  
    85.      }  
    86. }  

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

      1. package cn.itcast.model;  
      2.   
      3.   
      4.   
      5. public class Person {  
      6. private Integer id;  
      7. public Integer getId() {  
      8.     return id;  
      9. }  
      10.   
      11.   
      12. public void setId(Integer id) {  
      13.     this.id = id;  
      14. }  
      15.   
      16. private String name;  
      17. public String getName() {  
      18.     return name;  
      19. }  
      20.   
      21.   
      22. public void setName(String name) {  
      23.     this.name = name;  
      24. }  
      25.   
      26. private Integer age;  
      27. public Integer getAge() {  
      28.     return age;  
      29. }  
      30.   
      31.   
      32. public void setAge(Integer age) {  
      33.     this.age = age;  
      34. }  
      35.   
      36.   
      37.   
      38.   
      39.   
      40. public Person()  
      41. {  
      42. }  
      43. public Person(Integer id, String name, Integer age) {  
      44.       
      45.     this.id = id;  
      46.     this.name = name;  
      47.     this.age = age;  
      48. }  
      49.   
      50.   
      51. @Override  
      52. public String toString() {  
      53.     return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";  
      54. }  
      55.   
      56. }  

    转载自:http://blog.csdn.net/dinglang_2009/article/details/6940225

  • 相关阅读:
    CTF-Reverse-[GXYCTF2019]luck_guy
    凸度偏差与收益率曲线
    【翻译】理解 LSTM 网络
    基于 Keras 用 LSTM 网络做时间序列预测
    AIMR 固定收益推荐读物
    基于 Keras 用深度学习预测时间序列
    预测美国债券回报
    久期增加会提高长期预期回报吗?
    市场收益率预期与远期收益率
    sql server 查询时会锁表吗?
  • 原文地址:https://www.cnblogs.com/YangBinChina/p/3998191.html
Copyright © 2020-2023  润新知