您的位置:首页 > 其它

采用Pull解析器解析XML内容

2015-10-15 08:43 363 查看

采用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进行解析的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: