Android原生系统的XML解析就是用的pull解析。由此我们可以得出两个信号:
1、pull解析肯定有独特的优势,能从dom、sax解析中脱颖而出。
2、我们在使用pull解析时不需要导入额外的第三方jar包,直接使用。
本例中用到的权限有:sd卡文件读写权限
文件目录如下图:
图:xml pull解析文件目录
在Android Studio下,将需要解析的文件放入assets目录,新建asset目录的方法:右键src后,如下图操作:
图:新建assets目录
以下是xml pull解析的核心文件。
1、Person.xml 文件
public class Person {
private int id;
private String name;
private int age;
public Person(){
}
public Person(int id, String name, int age){
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
2、XmlParser.java文件
public class XmlParser {
/**
* 用pull解析器解析xml文件,存入List 集合中
*
* @param in 读取的Person.xml文件对应的输入流
* @return 将读取到的List集合返回
* @throws Exception
*/
public static List xmlParser(InputStream in) throws Exception {
List persons = null;
Person person = null;
XmlPullParser parser = Xml.newPullParser();
parser.setInput(in, "utf-8");
int event = parser.getEventType();
while (XmlPullParser.END_DOCUMENT != event) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList();
break;
case XmlPullParser.START_TAG:
if ("person".equals(parser.getName())) {
person = new Person();
int id = new Integer(parser.getAttributeValue(0));
person.setId(id);
}
if ("name".equals(parser.getName())) {
String name = parser.nextText();
if (null != name) {
person.setName(name);
}
}
if ("age".equals(parser.getName())) {
String text = parser.nextText();
if (null != text) {
int age = new Integer(text);
person.setAge(age);
}
}
break;
case XmlPullParser.END_TAG:
if ("person".equals(parser.getName()) && (null != persons && null != person)) {
persons.add(person);
person = null;
}
break;
}
event = parser.next();
}
return persons;
}
/**
* 用 XmlSerializer 将List 集合放入XML文件中
* @param persons 要写入XML的List集合
* @param os 写入到哪里
* @throws Exception
*/
public static void createXML(List persons, OutputStream os) throws Exception {
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(os, "utf-8");
serializer.startDocument("utf-8", true);
serializer.startTag(null, "persons");
for(Person person : persons) {
serializer.startTag(null, "person");
serializer.attribute(null, "id", person.getId() + "");
serializer.startTag(null, "name");
serializer.text(person.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(person.getAge()+"");
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
os.flush();
os.close();
}
}
3、XmlParserTest .java文件
public class XmlParserTest extends AndroidTestCase {
private static final String TAG = "XmlParserTest";
/**
* 测试解析XML是否正确
*/
public void test() {
AssetManager manager = this.getContext().getAssets();
try {
InputStream in = manager.open("Person.xml");
List persons = XmlParser.xmlParser(in);
for(Person person:persons){
Log.i(TAG, "id:"+person.getId()+
";name:"+person.getName()+
";age:"+person.getAge());
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 测试写入List集合到XML文件中是否正确
*/
public void test2(){
List persons = new ArrayList();
persons.add(new Person(1,"丽丽", 18));
persons.add(new Person(2, "花花", 20));
File f = CheckFileUtil.checkFile(Constants.FILE_PATH, "createXml.xml");
try {
FileOutputStream fos = new FileOutputStream(f);
XmlParser.createXML(persons, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
将 List
1、assets目录下,不可写;
2、真机未root,无法访问data/data目录;
3、模拟器需要下载,太麻烦了,而且电脑本身有些慢。
直接下载demo