Android内部采用Pull解析器对XML进行解析。
Pull解析器解析原理:
读取XML数据到字符数组中;
开始解析——挨个字符读取XML文件,判断是否符合XMl语法,如符合,则会触发对应的事件。
下面通过一个例子来说明。
比如要解析如下XML文件
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="10">
<name>gaohao</name>
<age>25</age>
</person>
<person id="11">
<name>gaofeng</name>
<age>31</age>
</person>
</persons>
在domain层新建Person类,存放从XML解析出来的数据
public class Person {
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
在业务层新建PersonService类,解析XML文件
public class PersonService {
public static List<Person> getPersons(InputStream xml) throws Exception{
List<Person> persons = null;
Person person = null;
//使用Pull解析XML文件
//XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();//得到Pull解析器
XmlPullParser pullParser =Xml.newPullParser();//也可以用该方法创建解析器
pullParser.setInput(xml, "UTF-8");//设置Pull解析器要解析的数据
//产生事件
int event = pullParser.getEventType();
//对事件进行判断
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT://文档开始
persons = new ArrayList<Person>();//存放解析数据数组的初始化
break;
case XmlPullParser.START_TAG:
if("person".equals(pullParser.getName())){
int id = new Integer(pullParser.getAttributeValue(0));
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 = new Integer(pullParser.nextText());//得到后面的文本
person.setAge(age);
}
break;
case XmlPullParser.END_TAG:
if ("person".equals(pullParser.getName())) {
persons.add(person);
person = null;
}
break;
}
//解析完第一个字符,会停止解析,要让其继续,需要调用如下方法
event = pullParser.next();//进入到后面的节点,触发case XmlPullParser.START_TAG事件,利用循环解析
}
return persons;
}
}
通过以上步骤即可将XML文件中的数据解析出来,通过单元测试显示解析出来的数据
在AndroidManifest.xml文件中引入单元测试环境
<uses-library android:name="android.test.runner" />
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="cn.gaohao.xml" android:label="Test for my App" />
新建一个单元测试方法
public class PersonServiceTest extends AndroidTestCase {
private static final String TAG = "PersonServiceTest";
public void testPersons() throws Exception{
InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");
List<Person> persons= PersonService.getPersons(xml);
for (Person person : persons) {
Log.i(TAG, person.toString());
}
}
}
03-28 06:13:45.375: INFO/PersonServiceTest(1247): Person [id=10, name=gaohao, age=25]
03-28 06:13:45.375: INFO/PersonServiceTest(1247): Person [id=11, name=gaofeng, age=31]
通过以上方法即可实现对XML文件中数据的解析。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。