采用Pull解析器解析XML内容
现在来讲一下 采用Pull解析器解析XML内容
在Android已经集成进了Pull解析器,所以无需添加任何jar文件
Android系统本身用到的xml,其内部也是采用Pull解析器进行解析的。
下面是一个xml文件:person.xml ,是直接放在src目录下的
<span style="white-space:pre"> </span><?xml version="1.0" encoding="UTF-8" ?> <!-- start document -->
<persons>
<person id="23">
<name>liming</name>
<age>30</age>
</person>
<person id="20">
<name>zhangxiaoxiao</name>
<age>25</age>
</person>
</persons>
<!-- end document -->
现在写一个在PersonService类,这是解析xml的类
/**
* 采用Pull解析器解析XML内容
* 获取数据
* @param xml
* @return
* @throws Exception
*/
public static List<Person> getPersons(InputStream xml) throws Exception{
List<Person> persons = null;
Person person = null;
//获取Pull解析器,两个方法:
//一:XmlPullParser pull = XmlPullParserFactory.newInstance().newPullParser();
//二:Xml是Android提供的帮助类Xml.newPullParser()
XmlPullParser pullParser = Xml.newPullParser();
//为Pull解析器设置要解析的XML数据
pullParser.setInput(xml, "UTF-8");
int event = pullParser.getEventType();
//event事件没到文档结束的时候
while(event != XmlPullParser.END_DOCUMENT){
switch (event) {
case XmlPullParser.START_DOCUMENT:
//读到<persons>节点:
persons = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
//读到开始标签时
//pullParser.getName()节点的名字
if( "person".equals(pullParser.getName()) ){
//获取parser里的属性id
int id = Integer.parseInt(pullParser.getAttributeValue(0));
//new 一个Person对象
person = new Person();
person.setId(id);
}
if( "name".equals(pullParser.getName()) ){
//返回这个节点的后面的文本节点值,也就是这个节点的文本内容
String name = pullParser.nextText();
person.setName(name);
}
if( "age".equals(pullParser.getName()) ){
int age = Integer.parseInt(pullParser.nextText());
person.setAge(age);
}
break;
case XmlPullParser.END_TAG:
//若读到person尾节点,就把person对象add到List中,后对象设置为null
if( "person".equals(pullParser.getName()) ){
persons.add(person);
person = null;
}
break;
}
event = pullParser.next();
}
return persons;
}
用Junit单元测试类测试
先在清单文件AndroidManifest.xml中加入:
<uses-library android:name="android.test.runner"/>
<span style="white-space:pre"> </span><instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.me_xmlandroid"
android:label="解析器解析和生成XML内容"></instrumentation>
在测试类中:
public class PersonServiceTest extends AndroidTestCase{
private static final String TAG = "PersonServiceTest";
public void testPersons() throws Exception{
//取得当前类的class对象 获取类加载器ClassLoader ,
//用类加载器getResourceAsStream()方法从根路径寻找这个文件,以输入流的方式返回出来
InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");
List<Person> persons = PersonService.getPersons(xml);
for (Person person : persons) {
Log.i(TAG, person.toString());
}
}
}
现在就可以测试一下了,是可以准确的对xml进行解析的