`

XML解析和生成之--pull(android内置)

阅读更多

Pull是Android内置的xml解析器Pull解析器的运行方式与SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。

下面我们来写代码学习pull解析技术。

要解析的xml文件名为:target.xml,解析的内容如下:

Xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persons>  
  3.     <person id="23">  
  4.         <name>liming</name>  
  5.         <age>30</age>  
  6.     </person>  
  7.     <person id="20">  
  8.         <name>lixiangmei</name>  
  9.         <age>25</age>  
  10.     </person>  
  11. </persons>   

 同样,我们在android的工程下写代码测试,使用android的单元测试技术进行测试,当然测试类还要继承AndroidTestCase

layout/res/AndroidManifest.xml文件下添加单元测试所需要的代码:

AndroidManifest.xml文件的application节点下添加以下代码

 

Xml代码 复制代码 收藏代码
  1. <uses-library android:name="android.test.runner" />   

AndroidManifest.xml文件的manifest节点下添加以下代码

Xml代码 复制代码 收藏代码
  1. <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="你的测试文件所在的包名" android:label="Tests for My App" />  

 

Java代码 复制代码 收藏代码
  1. public class Person {   
  2.     private Integer id;   
  3.     private String name;   
  4.     private Short age;   
  5.     public Person(){}//无参构造器   
  6.        
  7.     public Person(Integer id, String name, Short age) {   
  8.         this.id = id;   
  9.         this.name = name;   
  10.         this.age = age;   
  11.     }   
  12.        
  13.     public Integer getId() {   
  14.         return id;   
  15.     }   
  16.     public void setId(Integer id) {   
  17.         this.id = id;   
  18.     }   
  19.     public String getName() {   
  20.         return name;   
  21.     }   
  22.     public void setName(String name) {   
  23.         this.name = name;   
  24.     }   
  25.     public Short getAge() {   
  26.         return age;   
  27.     }   
  28.     public void setAge(Short age) {   
  29.         this.age = age;   
  30.     }   
  31.     @Override  
  32.     public String toString() {   
  33.         return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";   
  34.     }   
  35. }   

pull解析的核心类:PULLPersonService.java,里面包含两个方法,一个是生成xml文件的方法,一个事解析xml文件的方法。

Java代码 复制代码 收藏代码
  1. /**  
  2.  * 采用Pull解析XML内容  
  3.  */  
  4. public class PULLPersonService {   
  5.        
  6.     /**  
  7.      * 使用pull技术生成xml文件  
  8.      * @param persons  
  9.      * @param writer  
  10.      * @throws Throwable  
  11.      */  
  12.     public static void save(List<Person> persons, Writer writer) throws Throwable{   
  13.         XmlSerializer serializer = Xml.newSerializer();   
  14.         serializer.setOutput(writer);   
  15.         serializer.startDocument("UTF-8"true);   
  16.            
  17.         serializer.startTag(null"persons");   
  18.         for(Person person : persons){   
  19.             serializer.startTag(null"person");   
  20.             serializer.attribute(null"id", person.getId().toString());   
  21.                
  22.             serializer.startTag(null"name");   
  23.             serializer.text(person.getName());   
  24.             serializer.endTag(null"name");   
  25.                
  26.             serializer.startTag(null"age");   
  27.             serializer.text(person.getAge().toString());   
  28.             serializer.endTag(null"age");   
  29.                
  30.             serializer.endTag(null"person");   
  31.         }   
  32.         serializer.endTag(null"persons");        
  33.         serializer.endDocument();   
  34.         writer.flush();   
  35.         writer.close();   
  36.     }   
  37.   
  38.     /**  
  39.      * 使用pull技术解析xml  
  40.      * @param inStream  
  41.      * @return  
  42.      * @throws Throwable  
  43.      */  
  44.     public static List<Person> getPersons(InputStream inStream) throws Throwable{   
  45.         List<Person> persons = null;   
  46.         Person person = null;   
  47.         XmlPullParser parser = Xml.newPullParser();   
  48.         parser.setInput(inStream, "UTF-8");   
  49.         int eventType = parser.getEventType();//产生第一个事件   
  50.         while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件   
  51.             switch (eventType) {   
  52.             case XmlPullParser.START_DOCUMENT:   
  53.                 persons = new ArrayList<Person>();   
  54.                 break;   
  55.        
  56.             case XmlPullParser.START_TAG:   
  57.                 String name = parser.getName();//获取解析器当前指向的元素的名称   
  58.                 if("person".equals(name)){   
  59.                     person = new Person();   
  60.                     person.setId(new Integer(parser.getAttributeValue(0)));   
  61.                 }   
  62.                 if(person!=null){   
  63.                     if("name".equals(name)){   
  64.                         person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值   
  65.                     }   
  66.                     if("age".equals(name)){   
  67.                         person.setAge(new Short(parser.nextText()));   
  68.                     }   
  69.                 }   
  70.                 break;   
  71.             case XmlPullParser.END_TAG:   
  72.                 if("person".equals(parser.getName())){   
  73.                     persons.add(person);   
  74.                     person = null;   
  75.                 }   
  76.                 break;   
  77.             }   
  78.             eventType = parser.next();   
  79.         }   
  80.         return persons;   
  81.     }   
  82. }  
  1. public class PersonServiceTest extends AndroidTestCase {   
  2.     private static final String TAG = "PersonServiceTest";   
  3.        
  4.     public void testPullGetPersons() throws Throwable{   
  5.         InputStream inStream = getClass().getClassLoader().getResourceAsStream("target.xml");   
  6.         List<Person> persons = PULLPersonService.getPersons(inStream);   
  7.         for(Person person : persons){   
  8.             Log.i(TAG, person.toString());   
  9.         }   
  10.     }   
  11.        
  12.     public void testSave() throws Throwable{   
  13.         List<Person> persons = new ArrayList<Person>();   
  14.         persons.add(new Person(34"lili", (short)12));   
  15.         persons.add(new Person(25"mimi", (short)32));   
  16.         persons.add(new Person(33"xixi", (short)40));   
  17.         StringWriter writer = new StringWriter();   
  18.         PULLPersonService.save(persons, writer);   
  19.         Log.i(TAG, writer.toString());   
  20.     }   
  21. }  
public class PersonServiceTest extends AndroidTestCase {
	private static final String TAG = "PersonServiceTest";
	
	public void testPullGetPersons() throws Throwable{
		InputStream inStream = getClass().getClassLoader().getResourceAsStream("target.xml");
		List<Person> persons = PULLPersonService.getPersons(inStream);
		for(Person person : persons){
			Log.i(TAG, person.toString());
		}
	}
	
	public void testSave() throws Throwable{
		List<Person> persons = new ArrayList<Person>();
		persons.add(new Person(34, "lili", (short)12));
		persons.add(new Person(25, "mimi", (short)32));
		persons.add(new Person(33, "xixi", (short)40));
		StringWriter writer = new StringWriter();
		PULLPersonService.save(persons, writer);
		Log.i(TAG, writer.toString());
	}
}

用单元测试运行testPullGetPersons()方法,运行结果如下:

Xml代码 复制代码 收藏代码
  1. Person [age=30id=23name=liming]   
  2. Person [age=25id=20name=lixiangmei]  

 用单元测试运行 testSave()方法,运行结果如下:

Xml代码 复制代码 收藏代码
  1. <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>  
  2. <persons>  
  3.     <person id="34">  
  4.         <name>lili</name>  
  5.         <age>12</age>  
  6.     </person>  
  7.     <person id="25">  
  8.         <name>mimi</name>  
  9.         <age>32</age>  
  10.     </person>  
  11.     <person id="33">  
  12.         <name>xixi</name>  
  13.         <age>40</age>  
  14.     </person>  
  15. </persons>   

 到此完成了用pull技术完成xml的解析,和生成xml文件。 

<script type="text/javascript"></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>

分享到:
评论

相关推荐

    android xml多种解析生成

    Android XML 多种解析生成 Android 平台中,XML 文件解析和生成是非常重要的一部分。XML 文件可以存储和交换结构化数据,广泛应用于 Android 应用程序中。本文将介绍 Android 中使用多种解析和生成 XML 文件的方法...

    使用Android自带的XML解析器PULL解析器简单的解析xml

    Android系统提供了一种轻量级的XML解析方式——PULL解析器(Pull Parser),它适用于处理大型XML文档,因为它不需要像DOM解析器那样一次性加载整个XML文档到内存中。PULL解析器通过事件驱动的方式,按需解析XML文档...

    采用pull解析器解析和生成xml内容

    本篇文章将深入探讨如何在Android环境中使用内置的Pull解析器来解析和生成XML内容。 首先,我们需要理解什么是Pull解析器。Pull解析器是一种事件驱动的解析模型,它不像SAX解析器那样需要开发者提供回调方法,而是...

    Android应用源码之比较通用的xml解析方法-IT计算机-毕业设计.zip

    本项目“Android应用源码之比较通用的XML解析方法”旨在探讨和实现不同XML解析方式,这对于理解和优化Android应用的性能至关重要。在毕业设计或论文研究中,掌握XML解析技巧是提升移动开发App质量的关键。 1. **DOM...

    安卓Android源码——比较通用的xml解析方法.zip

    - `PullParser`:它是Android系统内置的一种轻量级的XML解析器,基于事件驱动,与SAX类似,但更适应Android环境。 - `StaX`:Streaming API for XML,是另一种基于流的解析方式,介于SAX和DOM之间,提供了一种可...

    Android中使用pull解析器操作xml文件的解决办法

    在Android开发中,处理XML数据是一项常见的任务,而Android提供了内置的Pull解析器来高效地读取和生成XML文件。本文将详细介绍如何使用Pull解析器来操作XML。 首先,我们来理解什么是Pull解析器。Pull解析器是一种...

    android各种解析xml三种方式和json数据

    总结来说,XML解析在Android开发中主要涉及DOM、SAX和Pull三种方法,每种方法各有优缺点,应根据具体需求选择。而JSON数据通常借助于Gson或Jackson库,实现高效的数据交换。理解并熟练运用这些知识点,将有助于提升...

    比较通用的xml解析方法_android源码.zip

    4. Android内置的XML解析库: Android SDK还提供了`org.xmlpull.v1.XmlPullParser`和`org.xmlpull.v1.XmlSerializer`,这两个类用于XML的解析和生成。它们是轻量级的,适用于资源有限的移动设备。 5. Android的...

    android上使用DOM解析XML

    在Android 4.0及以上版本,我们可以使用内置的Java XML DOM API来实现XML解析。下面将详细介绍在Android中使用DOM解析XML的基本步骤和关键知识点。 1. **导入XML解析库** 在Android项目中,我们不需要额外导入库,...

    XML解析jar包

    在Java编程中,处理XML文件通常需要使用特定的解析库,本资源提供的"XML解析jar包"包含了多种流行的XML解析方法,如SAX、PULL、DOM、JDOM和DOM4J。 1. **SAX解析器**:SAX(Simple API for XML)是一种事件驱动的...

    关于UI jeson解析和xml解析

    Android SDK本身内置了两种XML解析方式:DOM解析和SAX解析。DOM解析会一次性加载整个XML文档到内存,适合小规模的XML处理;而SAX解析采用事件驱动的方式,逐行读取XML,占用内存少,适用于处理大型XML文件。除了系统...

    android解析xml文件《老罗Android开发视频教程》

    总之,《老罗Android开发视频教程》中关于XML解析的内容,旨在帮助开发者掌握不同解析方法,以便在实际项目中灵活选择和应用,提高应用的性能和用户体验。通过学习和实践,开发者能更好地理解和处理XML数据,提升...

    Android访问XML

    2. **Android内置的XML解析库**: - `org.xmlpull.v1.XmlPullParser`:Android提供的Pull解析API,用于高效、低内存消耗地解析XML。 - `org.w3c.dom.DocumentBuilderFactory` 和 `javax.xml.parsers....

    android使用Dom,Sax,Pull,Json

    Android提供了一个基于事件的XML解析API,称为Pull解析器。它类似于SAX,也是事件驱动的,但使用更简单,因为它是API级别的,不需要实现接口。开发者可以通过调用Pull解析器的next()方法按需获取下一个事件,这样...

    XML和JSON第三方解析包

    XML解析通常分为DOM(Document Object Model)解析和SAX(Simple API for XML)解析。DOM解析会将整个XML文档加载到内存中,形成一个树形结构,便于查找和操作;而SAX则采用事件驱动模型,只在读取时处理数据,内存...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    Android App中使用Pull解析XML格式数据的使用示例

    Pull解析器(XMLPullParser)是Android SDK内置的一种轻量级、高效的XML解析工具,适用于处理大体积的XML数据,避免了DOM解析可能导致的内存消耗过大问题。与SAX解析器相似,Pull解析器也是基于事件驱动的,它会逐个...

    XML在Android与Web双模式教学平台中数据交换的研究与应用.pdf

    在Android客户端,开发者通常有三种XML解析方式:DOM(Document Object Model)、SAX(Simple API for XML)和PULL解析器。DOM一次性加载整个XML文档到内存,适合小型数据处理,但不适合内存有限的移动设备。SAX采用...

    Android解析http常见数据格式的代码例子

    二、XML解析 XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于Web服务。Android提供了SAX、DOM和Pull解析器来处理XML数据。 1. SAX解析器:SAX是一种事件驱动的解析方式,适合处理大体积的...

    《Android开发提高十六技》--安卓巴士总结.docx

    6. **XML解析与生成**: - Android 中通常使用XML来存储和读取数据,如配置文件、布局文件等。Android提供了DOM、SAX和Pull解析器来解析XML。XML生成则涉及到创建XML文件或XML字符串的过程。 7. **SQLite 分页读取...

Global site tag (gtag.js) - Google Analytics