android(14)_解析xml文件1_pull

来源:互联网 发布:迅捷网络哪里能下载 编辑:程序博客网 时间:2024/05/21 17:04

除了可以使用 SAX和DOM解析XML文件,大家也可以使用Android内置的Pull解析器解析XML文件。 

Pull解析器的运行方式与 SAX 解析器相似。

它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。

事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。

当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。


Pull解析器的源码及文档下载网址:http://www.xmlpull.org/

Strings.xml

<?xml version="1.0" encoding="utf-8"?><resources>    <string name="app_name">lession03_xml</string>    <string name="action_settings">Settings</string>    <string name="hello_world">Hello world!</string>    <string name="btn_sax">采用sax解析xml文件</string>    <string name="btn_dom">采用dom解析方式解析</string>    <string name="btn_pull">采用pull解析方式解析</string>    <string name="btn_cpull">采用pull解析生成xml文件</string></resources>


activity_xml.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".XmlActivity" >    <Button        android:id="@+id/button_cpull"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignLeft="@+id/btn_pull"        android:layout_alignRight="@+id/btn_pull"        android:layout_below="@+id/btn_pull"        android:layout_marginTop="20dp"        android:text="@string/btn_cpull" />    <Button        android:id="@+id/btn_sax"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_alignParentRight="true"        android:text="@string/btn_sax" />    <Button        android:id="@+id/btn_pull"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignLeft="@+id/btn_dom"        android:layout_alignRight="@+id/btn_dom"        android:layout_below="@+id/btn_dom"        android:layout_marginTop="68dp"        android:text="@string/btn_pull" />    <Button        android:id="@+id/btn_dom"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignLeft="@+id/btn_sax"        android:layout_alignRight="@+id/btn_sax"        android:layout_below="@+id/btn_sax"        android:layout_marginTop="60dp"        android:text="@string/btn_dom" /></RelativeLayout>

Person.java

package com.example.lession03_xml.domain;import java.io.Serializable;/** * 创建一个javabean存储xml解析的数据 *  * @author chenhj *  */public class Person implements Serializable {/** *  */private static final long serialVersionUID = 1L;private int id;private String name;private short age;public Person() {super();// TODO Auto-generated constructor stub}public Person(int id, String name, short age) {super();this.id = id;this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public short getAge() {return age;}public void setAge(short age) {this.age = age;}}

XMLPullService.java

package com.example.lession03_xml.service;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlSerializer;import android.R.bool;import android.os.Environment;import android.provider.ContactsContract.CommonDataKinds.Event;import android.util.Xml;import com.example.lession03_xml.domain.Person;/** * 采用pull解析xml文件 事件驱动 开始,结束元素事件 产生的事件是一个数字,通过switch语句体现 *  * @author zhaoyazhi *  */public class XMLPullService {public List<Person> getPerson(InputStream inputStream) throws Exception {List<Person> persons = null;Person person = null;// android提供一个类XmlPullParser,得到pull解析器XmlPullParser pullParser = Xml.newPullParser();// 设置要进行解析的内容,不是立刻发生,调用才发生pullParser.setInput(inputStream, "utf-8");/* <?xml version="1.0" encoding="UTF-8"?> */// 触发第一个事件 用数字形式表示 开始文档事件int event = pullParser.getEventType();// 不等于文档的结束时间while (event != XmlPullParser.END_DOCUMENT) {// 属于开始文档事件switch (event) {case XmlPullParser.START_DOCUMENT:persons = new ArrayList<Person>();break;case XmlPullParser.START_TAG:/* <persons> */if ("person".equals(pullParser.getName())) {/* <person id="23"> */int id = new Integer(pullParser.getAttributeValue(0));person = new Person();person.setId(id);}if (person != null) {/* <name> */if ("name".equals(pullParser.getName())) {// 返回文本的值/* 李明 */person.setName(pullParser.nextText());}/* <age> */if ("age".equals(pullParser.getName())) {/* 30 */person.setAge(new Short(pullParser.nextText()));}}break;// 结束元素事件/* </persons> */case XmlPullParser.END_TAG:// 当前解析器指向的节点为personif ("person".equals(pullParser.getName())) {persons.add(person);person = null;}break;}// 解析器向后解析event = pullParser.next();}return persons;}}


XmlActivity.java

package com.example.lession03_xml;import java.io.InputStream;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import com.example.lession03_xml.domain.Person;import com.example.lession03_xml.service.XMLContentHandlerService;import com.example.lession03_xml.service.XMLDomService;import com.example.lession03_xml.service.XMLPullService;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.Toast;public class XmlActivity extends Activity {// 声明控件public Button btn_sax, btn_dom, btn_pull, btn_cpull;public XMLDomService xmlDomService;public XMLPullService xmlPullService;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 设置显示的视图setContentView(R.layout.activity_xml);// 实例化xmlDomService = new XMLDomService();xmlPullService = new XMLPullService();// 通过findViewById方法获取控件对象btn_sax = (Button) findViewById(R.id.btn_sax);btn_dom = (Button) findViewById(R.id.btn_dom);btn_pull = (Button) findViewById(R.id.btn_pull);btn_cpull = (Button) findViewById(R.id.button_cpull);// 给按钮注册事件btn_sax.setOnClickListener(new MyClickListener());btn_dom.setOnClickListener(new MyClickListener());btn_pull.setOnClickListener(new MyClickListener());btn_cpull.setOnClickListener(new MyClickListener());}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.xml, menu);return true;}class MyClickListener implements View.OnClickListener {@Overridepublic void onClick(View v) {// 获取组件的idint id = v.getId();switch (id) {case R.id.btn_sax:Toast.makeText(XmlActivity.this, "采用sax解析xml文件案例",Toast.LENGTH_LONG).show();// sax解析的工厂对象SAXParserFactory factory = SAXParserFactory.newInstance();try {// 得到sax的解析器SAXParser saxParser = factory.newSAXParser();// 创建handler对象XMLContentHandlerService handlerService = new XMLContentHandlerService();// 获取到了 asserts目录中 csdn.xml文件InputStream is = getAssets().open("csdn.xml");// 直接解析 InputStream的流对象saxParser.parse(is, handlerService);// 通过 handlerService对象Toast.makeText(XmlActivity.this,"---" + handlerService.getPersons().size(),Toast.LENGTH_LONG).show();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}break;case R.id.btn_dom:InputStream is = null;try {// 获取读取文件的输入流对象is = getAssets().open("csdn.xml");// 采用List<Person> persons = xmlDomService.parseXML(is);//Toast.makeText(XmlActivity.this,"" + persons.get(0).getName(), Toast.LENGTH_LONG).show();} catch (Exception e) {e.printStackTrace();}break;case R.id.btn_pull:List<Person> persons = null;try {persons = xmlPullService.getPerson(getAssets().open("csdn.xml"));} catch (Exception e) {e.printStackTrace();}if (persons != null) {Toast.makeText(XmlActivity.this,"采用pull解析xml文件" + persons.get(0).getName() + "--"+ persons.get(1).getName(),Toast.LENGTH_LONG).show();}break;case R.id.button_cpull:break;default:break;}}}}


原创粉丝点击