Android 创建与解析XML(四)—— Pull方式

1、Pull概述

Android系统中和创建XML相关的包为org.xmlpull.v1,在这个包中不仅提供了用于创建XML的 XmlSerializer,还提供了用来解析XML的Pull方式解析器 XmlPullParser

XmlSerializer没有像XmlPullParser那样提取XML事件,而是把它们推出到数据流OutputStream或Writer中。

XmlSerializer提供了很直观的API,即使用startDocument开始文档,endDocument结束文档,startTag开始元素,endTag结束元素,text添加文本等。

Pull方式创建XML,应用了标准xml构造器 org.xmlpull.v1.XmlSerializer来创建 XML ,org.xmlpull.v1.XmlPullParser来解析XML,需要导入以下内容

org.xmlpull.v1

org.xmlpull.v1.XmlPullParser;

org.xmlpull.v1.XmlPullParserException;

org.xmlpull.v1.XmlPullParserFactory;

org.xmlpull.v1.XmlSerializer;

sdk源码查看路径(google code

Pull 创建和解析 XML 的效果图:

2、Pull 创建 XML

pull方式,创建xml是通过 XmlSerializer 类实现

首先,通过XmlSerializer得到创建xml的实例 xmlSerializer

接着,通过 xmlSerializer 设置输出 xmlSerializer.setOutput,xmlSerializer.startDocument("utf-8", null)设置xml属性等

然后,通过 xmlSerializer 创建 startDocument、startTag、text、endTag、endDocument等

Code

[java] view
plain
copyprint?

  1.     /** Pull方式,创建 XML  */  
  2.     public String pullXMLCreate(){  
  3.         StringWriter xmlWriter = new StringWriter();  
  4.   
  5.         Person []persons = new Person[3];       // 创建节点Person对象  
  6.         persons[0] = new Person(1, "sunboy_2050", "http://blog.csdn.net/sunboy_2050");  
  7.         persons[1] = new Person(2, "baidu", "http://www.baidu.com");  
  8.         persons[2] = new Person(3, "google", "http://www.google.com");  
  9.           
  10.         try {  
  11. //          // 方式一:使用Android提供的实用工具类android.util.Xml  
  12. //          XmlSerializer xmlSerializer = Xml.newSerializer();        
  13.               
  14.             // 方式二:使用工厂类XmlPullParserFactory的方式  
  15.             XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  
  16.             XmlSerializer xmlSerializer = factory.newSerializer();  
  17.               
  18.             xmlSerializer.setOutput(xmlWriter);             // 保存创建的xml  
  19.               
  20.             xmlSerializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);  
  21. //          xmlSerializer.setProperty("http://xmlpull.org/v1/doc/properties.html#serializer-indentation", " ");         // 设置属性  
  22. //          xmlSerializer.setProperty("http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n");  
  23.             xmlSerializer.startDocument("utf-8", null);     // <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>   
  24.               
  25.             xmlSerializer.startTag("", "root");  
  26.             xmlSerializer.attribute("", "author", "homer");  
  27.             xmlSerializer.attribute("", "date", "2012-04-28");  
  28.               
  29.             int personsLen = persons.length;  
  30.             for(int i=0; i<personsLen; i++) {  
  31.                 xmlSerializer.startTag("", "person");       // 创建person节点  
  32.                   
  33.                 xmlSerializer.startTag("", "id");  
  34.                 xmlSerializer.text(persons[i].getId()+"");  
  35.                 xmlSerializer.endTag("", "id");  
  36.   
  37.                 xmlSerializer.startTag("", "name");  
  38.                 xmlSerializer.text(persons[i].getName());  
  39.                 xmlSerializer.endTag("", "name");  
  40.   
  41.                 xmlSerializer.startTag("", "blog");  
  42.                 xmlSerializer.text(persons[i].getBlog());  
  43.                 xmlSerializer.endTag("", "blog");  
  44.                   
  45.                 xmlSerializer.endTag("", "person");  
  46.             }  
  47.               
  48.             xmlSerializer.endTag("", "root");  
  49.             xmlSerializer.endDocument();  
  50.               
  51.         } catch (XmlPullParserException e) {        // XmlPullParserFactory.newInstance  
  52.             e.printStackTrace();  
  53.         } catch (IllegalArgumentException e) {      // xmlSerializer.setOutput  
  54.             e.printStackTrace();  
  55.         } catch (IllegalStateException e) {         // xmlSerializer.setOutput  
  56.             e.printStackTrace();  
  57.         } catch (IOException e) {       // xmlSerializer.setOutput  
  58.             e.printStackTrace();  
  59.         } catch (Exception e) {  
  60.             e.printStackTrace();  
  61.         }  
  62.           
  63.         savedXML(fileName, xmlWriter.toString());  
  64.         return xmlWriter.toString();  
  65.     }  

运行结果:


3、Pull 解析 XML

pull方式,解析xml是通过 XmlPullParser 类实现

首先,通过XmlPullParser得到解析xml的实例 xpp

接着,通过 xpp设置输入 xpp.setInput(is, "utf-8"),声明定义保存xml信息的数据结构(如:Person数组)

然后,通过 xpp 解析 START_DOCUMENT、START_TAG、TEXT、END_TAG、END_DOCUMENT等

Code

[java] view
plain
copyprint?

  1.     /** Pull方式,解析 XML  */  
  2.     public String pullXMLResolve(){  
  3.         StringWriter xmlWriter = new StringWriter();  
  4.           
  5.         InputStream is = readXML(fileName);  
  6.         try {  
  7. //          // 方式一:使用Android提供的实用工具类android.util.Xml  
  8. //          XmlPullParser xpp = Xml.newPullParser();  
  9.               
  10.             // 方式二:使用工厂类XmlPullParserFactory的方式  
  11.             XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  
  12.             XmlPullParser xpp = factory.newPullParser();  
  13.               
  14.             xpp.setInput(is, "utf-8");  
  15.               
  16.             List<Person> personsList = null;      // 保存xml的person节点  
  17.             Person person = null;  
  18.             StringBuffer xmlHeader = null;          // 保存xml头部  
  19.             String ele = null;      // Element flag  
  20.               
  21.             int eventType = xpp.getEventType();  
  22.             while(XmlPullParser.END_DOCUMENT != eventType) {  
  23.                 switch (eventType) {  
  24.                 case XmlPullParser.START_DOCUMENT:  
  25.                     personsList = new ArrayList<Person>();        // 初始化persons  
  26.                     xmlHeader = new StringBuffer();             // 初始化xmlHeader  
  27.                     break;  
  28.                       
  29.                 case XmlPullParser.START_TAG:  
  30.                     if("root".equals(xpp.getName())) {  
  31.                         String attrAuthor = xpp.getAttributeValue(0);  
  32.                         String attrDate = xpp.getAttributeValue(1);  
  33.                         xmlHeader.append("root").append("\t\t");  
  34.                         xmlHeader.append(attrAuthor).append("\t");  
  35.                         xmlHeader.append(attrDate).append("\n");  
  36.                     } else if("person".equals(xpp.getName())) {  
  37.                         person = new Person();          // 创建person实例  
  38.                     } else if("id".equals(xpp.getName())) {  
  39.                         ele = "id";  
  40.                     } else if("name".equals(xpp.getName())) {  
  41.                         ele = "name";  
  42.                     } else if("blog".equals(xpp.getName())) {  
  43.                         ele = "blog";  
  44.                     } else {  
  45.                         ele = null;  
  46.                     }  
  47.                     break;  
  48.                       
  49.                 case XmlPullParser.TEXT:  
  50.                     if(null != ele) {  
  51.                         if("id".equals(ele)) {  
  52.                             person.setId(Integer.parseInt(xpp.getText()));  
  53.                         } else if("name".equals(ele)) {  
  54.                             person.setName(xpp.getText());  
  55.                         } else if("blog".equals(ele)) {  
  56.                             person.setBlog(xpp.getText());  
  57.                         }  
  58.                     }  
  59.                     break;  
  60.                       
  61.                 case XmlPullParser.END_TAG:  
  62.                     if("person".equals(xpp.getName())){  
  63.                         personsList.add(person);  
  64.                         person = null;  
  65.                     }  
  66.                     ele = null;  
  67.                     break;  
  68.                 }  
  69.                   
  70.                 eventType = xpp.next();     // 下一个事件类型  
  71.             }  
  72.               
  73.             xmlWriter.append(xmlHeader);  
  74.             int personsLen = personsList.size();  
  75.             for(int i=0; i<personsLen; i++) {  
  76.                 xmlWriter.append(personsList.get(i).toString());  
  77.             }  
  78.               
  79.         } catch (XmlPullParserException e) {        // XmlPullParserFactory.newInstance  
  80.             e.printStackTrace();  
  81.         } catch (Exception e) {  
  82.             e.printStackTrace();  
  83.         }  
  84.           
  85.         return xmlWriter.toString();          
  86.     }  

运行结果:

时间: 2024-12-30 01:36:07

Android 创建与解析XML(四)—— Pull方式的相关文章

Android创建与解析XML(四) Pull方式

1.Pull概述 Android系统中和创建XML相关的包为org.xmlpull.v1,在这个包中不仅提供了用于创建XML的 XmlSerializer,还提供了用来解析XML的Pull方式解析器 XmlPullParser XmlSerializer没有像XmlPullParser那样提取 XML事件,而是把它们推出到数据流OutputStream或Writer中. XmlSerializer提供了很直观的API,即使用 startDocument开始文档,endDocument结束文档,s

Android 创建与解析XML(四)——详解Pull方式_Android

 1.Pull概述 Android系统中和创建XML相关的包为org.xmlpull.v1,在这个包中不仅提供了用于创建XML的 XmlSerializer,还提供了用来解析XML的Pull方式解析器 XmlPullParser XmlSerializer没有像XmlPullParser那样提取XML事件,而是把它们推出到数据流OutputStream或Writer中. XmlSerializer提供了很直观的API,即使用startDocument开始文档,endDocument结束文档,st

Android 创建与解析XML(四)——详解Pull方式

1.Pull概述 Android系统中和创建XML相关的包为org.xmlpull.v1,在这个包中不仅提供了用于创建XML的 XmlSerializer,还提供了用来解析XML的Pull方式解析器 XmlPullParser XmlSerializer没有像XmlPullParser那样提取XML事件,而是把它们推出到数据流OutputStream或Writer中. XmlSerializer提供了很直观的API,即使用startDocument开始文档,endDocument结束文档,sta

Android 创建与解析XML(五)——详解Dom4j方式_Android

1.Dom4j概述 dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP. dom4j官方网址:dom4j  dom4j源码下载:dom4j download 本示例中,需要导入dom4

Android创建与解析XML(三)——详解Sax方式_Android

1. Sax概述 SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,不需要解析完整个文档,而是按照内容顺序看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法 定义在ContentHandler中,下面是其主要方法: startDocument():当遇到文档的时候就触发这个事件 调用这个方法 可以在其中做些预处理工作,如:申请对象资源 endDocument():当结束文档的时候就触发这个事件 调用这个方法 可以在其中

Android创建与解析XML(三)——详解Sax方式

1. Sax概述 SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,不需要解析完整个文档,而是按照内容顺序看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法 定义在ContentHandler中,下面是其主要方法: startDocument():当遇到文档的时候就触发这个事件 调用这个方法 可以在其中做些预处理工作,如:申请对象资源 endDocument():当结束文档的时候就触发这个事件 调用这个方法 可以在其中

Android 创建与解析XML(五)——详解Dom4j方式

1.Dom4j概述 dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP. dom4j官方网址:dom4j dom4j源码下载:dom4j download 本示例中,需要导入dom4j

Android创建与解析XML(六) 比较与使用

前面介绍了四种创建.解析XML的方式: 0. Android 创建与解析XML(一)-- 概述 1. Android 创建与 解析XML(二)-- Dom方式 2. Android 创建与解析XML(三)-- Sax方式 3. Android 创建与解析XML(四 )-- Pull方式 4. Android 创建与解析XML(五)-- Dom4j方式 其中,从处理方式看,有的采用了Java处理 XML的标准方式,有的是经过第三方改进后的XML处理方式:从事件角度看,有的是基于Dom树节点,有的基

Android 创建与解析XML(二)—— Dom方式

1. Dom概述 Dom方式创建XML,应用了标准xml构造器 javax.xml.parsers.DocumentBuilder 来创建 XML 文档,需要导入以下内容 javax.xml.parsers javax.xml.parsers.DocumentBuilder  javax.xml.parsers.DocumentBuilderFactory  javax.xml.parsers.ParserConfigurationException; javax.xml.transform j