方法一:我们使用pull
第一步:需要解析的persons.xml
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23" grade="1">
<name>张三</name>
<age>30</age>
</person>
<person grade="0" id="20">
<name>李四</name>
<age>25</age>
</person>
</persons>
第二步:编码关键Java代码
/**
* @param is 输入流
* @return 人员集合
* @throws Throwable
*/
public static List<Person> getPersons(InputStream is) throws Throwable {
List<Person> personList = new ArrayList<Person>();
Person person = null;
/** pull 解析工厂 */
XmlPullParserFactory pactory = XmlPullParserFactory.newInstance();
/** 过生工厂获取一个pull 解析器 */
XmlPullParser parser = pactory.newPullParser();
/**设定字符集编码*/
parser.setInput(is, "UTF-8");
/** 事件类型
* 读取到xml的声明返回数字0 START_DOCUMENT;
* 读取到xml的结束返回数字1 END_DOCUMENT ;
* 读取到xml的开始标签返回数字2 START_TAG
* 读取到xml的结束标签返回数字3 END_TAG
* 读取到xml的文本返回数字4 TEXT
*/
int event = parser.getEventType();
System.out.println("XmlPullParser.END_DOCUMENT:"+XmlPullParser.END_DOCUMENT); //返回1
System.out.println("XmlPullParser.START_DOCUMENT:"+ XmlPullParser.START_DOCUMENT);//返回1
System.out.println("XmlPullParser.END_TAG:"+XmlPullParser.END_TAG); //返回3
while (event != XmlPullParser.END_DOCUMENT) {
String nodeName = parser.getName();
switch (event) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
if ("person".equals(nodeName)) {
person = new Person();
person.setId(Integer.valueOf(parser.getAttributeValue(null,"id")));
person.setGrade(Integer.valueOf(parser.getAttributeValue(null,"grade")));
} else if ("name".equals(nodeName)) {
person.setName(parser.nextText());
} else if ("age".equals(nodeName)) {
person.setAge(Integer.valueOf(parser.nextText()));
}
break;
case XmlPullParser.END_TAG:
if ("person".equals(nodeName)) {
personList.add(person);
}
break;
default:
break;
}
event = parser.next();
}
return personList;
}
pull 也可以解析文本内容。
parser.setInput(new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?><persons><person id=\"23\" grade=\"1\"><name>张三</name><age>30</age><image>zs</image></person><person grade=\"0\" id=\"20\"><name>李四</name><age>25</age><image>ls</image> </person></persons> "));
第三步:编写测试代码。并申请测试权限
public class MyPullTest extends AndroidTestCase {
public void testPersonsPull(){
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("persons.xml");
try {
List<Person> personList = PullDemoActivity.getPersons(is);
for (Person p : personList) {
System.out.println(p.toString());
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hkrt.action"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<uses-library android:name="android.test.runner" />
<activity android:name=".PullDemoActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.hkrt.action" android:label="Tests for My App" />
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
注:targetPackage="设到启动的Activity包下"
结果图:
方法二:我们使用SAX 解析。
XMLContentHandler.java
package com.hkrt.action;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.hkrt.domain.Person;
public class XMLContentHandler extends DefaultHandler {
private List<Person> persons = null;
private Person currentPerson;
private String tagName = null;//当前解析的元素标签
public List<Person> getPersons() {
return persons;
}
/*
* 接收文档的开始的通知。
*/
@Override public void startDocument() throws SAXException {
persons = new ArrayList<Person>();
}
/*
* 接收字符数据的通知。
*/
@Override public void characters(char[] ch, int start, int length) throws SAXException {
if(tagName!=null){
String data = new String(ch, start, length);
if(tagName.equals("name")){
this.currentPerson.setName(data);
}else if(tagName.equals("age")){
this.currentPerson.setAge(Short.parseShort(data));
}
}
}
/*
* 接收元素开始的通知。
* 参数意义如下:
* namespaceURI:元素的命名空间
* localName :元素的本地名称(不带前缀)
* qName :元素的限定名(带前缀)
* atts :元素的属性集合
*/
@Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if(localName.equals("person")){
currentPerson = new Person();
currentPerson.setId(Integer.parseInt(atts.getValue("id")));
currentPerson.setGrade(Integer.parseInt(atts.getValue("grade")));
}
this.tagName = localName;
}
/*
* 接收文档的结尾的通知。
* 参数意义如下:
* uri :元素的命名空间
* localName :元素的本地名称(不带前缀)
* name :元素的限定名(带前缀)
*
*/
@Override public void endElement(String uri, String localName, String name) throws SAXException {
if(localName.equals("person")){
persons.add(currentPerson);
currentPerson = null;
}
this.tagName = null;
}
}
测试:
public void testPersonsSax(){
InputStream inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("persons.xml");
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser(); //创建解析器
//设置解析器的相关特性,http://xml.org/sax/features/namespaces = true 表示开启命名空间特性
//saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
XMLContentHandler handler = new XMLContentHandler();
//File file = new File("解析内容");
//saxParser.parse(file, handler);
saxParser.parse(inStream, handler);
inStream.close();
List<Person> personList = handler.getPersons();
for (Person p : personList) {
System.out.println("sax解析:"+p.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
结果图:
在应用中,具体用那个,那一个更好。请查看具体的资料。在此不多做描述。总之能用pull 就用pull。