一、使用Pull解析器读取XML文件

除了可以使用SAX或DOM解析XML文件之外,大家也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。 Pull解析器的运行方式与SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值

                 

              

二、使用Pull解析器生成XML文件

有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器。

使用Pull解析器生成一个与ljq.xml文件内容相同的myljq.xml文件,代码在本页下方备注

使用代码如下(生成XML文件):

File xmlFile = new File("myljq.xml");

FileOutputStream outStream = new FileOutputStream(xmlFile);

OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, "UTF-8");

BufferedWriter writer = new BufferedWriter(outStreamWriter);

writeXML(persons, writer);

writer.flush();

writer.close();

如果只想得到生成的xml字符串内容,可以使用StringWriter:

StringWriter writer = new StringWriter();

writeXML(persons, writer);

String content = writer.toString(); 

            

          

案例:

123.xml

         <?     xml version='1.0' encoding='UTF-8' standalone='yes'      ?>           <     persons     >           <     person      id     ="1"     >           <     name     >     zhangsan          name     >           <     age     >     12          age     >                person     >           <     person      id     ="2"     >           <     name     >     lisi          name     >           <     age     >     34          age     >                person     >                persons     >                       

            

PullPersonService pull解析器操作类

         package      com.ljq.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      com.ljq.entity.Person;      import      android.util.Xml;      /**      * Pull解析xml文件 * *      @author      jiqinlin *      */           public           class      PullPersonService {      /**      * 使用pull解析器生成xml文件 * *      @param      persons *      @param      writer *      @return           */           public           static      String writeXML(List     <     Person     >      persons, Writer writer){ XmlSerializer serializer      =      Xml.newSerializer();      try      { serializer.setOutput(writer); serializer.startDocument(     "     UTF-8     "     ,      true     );      //     第一个参数为命名空间,如果不使用命名空间,可以设置为null            serializer.startTag(     ""     ,      "     persons     "     );      for      (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(); }      catch      (Exception e) { e.printStackTrace(); }      return      writer.toString(); }      /**      * 使用pull解析器解析xml文件 * *      @param      inStream *      @return      *      @throws      Exception      */           public           static      List     <     Person     >      readXML(InputStream inStream)      throws      Exception { XmlPullParser parser      =      Xml.newPullParser(); parser.setInput(inStream,      "     UTF-8     "     );      int      eventType      =      parser.getEventType(); Person currentPerson      =           null     ; List     <     Person     >      persons      =           null     ;      while      (eventType      !=      XmlPullParser.END_DOCUMENT) {      switch      (eventType) {      case      XmlPullParser.START_DOCUMENT:     //      文档开始事件,可以进行数据初始化处理            persons      =           new      ArrayList     <     Person     >     ();      break     ;      case      XmlPullParser.START_TAG:     //      开始元素事件            String name      =      parser.getName();      if      (name.equalsIgnoreCase(     "     person     "     )) { currentPerson      =           new      Person(); currentPerson.setId(     new      Integer(parser.getAttributeValue(     null     ,      "     id     "     ))); }      else           if      (currentPerson      !=           null     ) {      if      (name.equalsIgnoreCase(     "     name     "     )) { currentPerson.setName(parser.nextText());     //      如果后面是Text元素,即返回它的值            }      else           if      (name.equalsIgnoreCase(     "     age     "     )) { currentPerson.setAge(     new      Short(parser.nextText())); } }      break     ;      case      XmlPullParser.END_TAG:     //      结束元素事件                 if      (parser.getName().equalsIgnoreCase(     "     person     "     )     &&      currentPerson      !=           null     ) { persons.add(currentPerson); currentPerson      =           null     ; }      break     ; } eventType      =      parser.next(); } inStream.close();      return      persons; } }                       

               

PullPersonServiceTest pull解析器测试类

         package      com.ljq.test;      import      java.io.BufferedWriter;      import      java.io.FileOutputStream;      import      java.io.InputStream;      import      java.io.OutputStreamWriter;      import      java.util.ArrayList;      import      java.util.List;      import      com.ljq.entity.Person;      import      com.ljq.service.PullPersonService;      import      android.content.Context;      import      android.test.AndroidTestCase;      import      android.util.Log;      public           class      PullPersonServiceTest      extends      AndroidTestCase{      private           final      String TAG      =           "     PullPersonServiceTest     "     ;      /**      * 使用pull解析器解析xml文件 * *      @throws      Exception      */           public           void      testReadXML()      throws      Exception{      //     InputStream inputStream = PullPersonServiceTest.class.getClassLoader().getResourceAsStream("ljq.xml");            InputStream inputStream     =           this     .getContext().openFileInput(     "     123.xml     "     ); List     <     Person     >      persons      =      PullPersonService.readXML(inputStream);      for     (Person person : persons){ Log.i(TAG, person.getId()      +           "      :      "           +      person.getName()      +           "      :      "           +      person.getAge()); } }      /**      * 使用pull解析器生成xml文件 * *      @throws      Exception      */           public           void      testWriteXml()      throws      Exception{ FileOutputStream fileOutputStream      =           this     .getContext().openFileOutput(     "     123.xml     "     , Context.MODE_PRIVATE); OutputStreamWriter outStreamWriter      =           new      OutputStreamWriter(fileOutputStream,      "     UTF-8     "     ); List     <     Person     >      persons      =           new      ArrayList     <     Person     >     (); persons.add(     new      Person(     1     ,      "     zhangsan     "     , (     short     )     12     )); persons.add(     new      Person(     2     ,      "     lisi     "     , (     short     )     34     )); BufferedWriter writer      =           new      BufferedWriter(outStreamWriter); String string      =      PullPersonService.writeXML(persons, writer); Log.i(TAG, string.toString()); } }        


转自:http://www.cnblogs.com/linjiqin/archive/2011/05/24/2055689.html

更多相关文章

  1. Android开发笔记之【Android(安卓)API】Android(安卓)4.1 API官
  2. Android内存管理-SoftReference的使用
  3. 解决android一直在running,打不开文件,下载不了gradle包的方法
  4. okhttp的应用详解与源码解析--okhttp客户端应用
  5. 使用Android(安卓)NDK中的独立toolchain来开发C/C++程序
  6. Android计算优化解析
  7. 箭头函数的基础使用
  8. NPM 和webpack 的基础使用
  9. Python list sort方法的具体使用

随机推荐

  1. 为什么说游戏更应该用容器!
  2. 重学 Kotlin —— object,史上最 “快”
  3. 一个cache相关的问题
  4. ElasticSearch ——结构化查询
  5. 最近在找织梦dede转移替代方案,分享一下小
  6. css基础
  7. HTML基础
  8. php生成PDF文件的方法
  9. PHP&&微信与支付宝支付一站式讲解与实战
  10. 实用攻略:云服务器如何选购?要考虑哪些因素