Android原生系統的XML解析就是用的pull解析。由此我們可以得出兩個信號:
1、pull解析肯定有獨特的優勢,能從dom、sax解析中脫穎而出。
2、我們在使用pull解析時不需要導入額外的第三方jar包,直接使用。
本例中用到的權限有:sd卡文件讀寫權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
文件目錄如下圖:
圖:xml pull解析文件目錄
在Android Studio下,將需要解析的文件放入assets目錄,新建asset目錄的方法:右鍵src後,如下圖操作:
圖:新建assets目錄
以下是xml pull解析的核心文件。
1、Person.xml 文件
<span style="font-size:12px;">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;
}
}</span>
2、XmlParser.java文件
<span style="font-size:12px;">public class XmlParser {
/**
* 用pull解析器解析xml文件,存入List<Person> 集合中
*
* @param in 讀取的Person.xml文件對應的輸入流
* @return 將讀取到的List<Person>集合返回
* @throws Exception
*/
public static List<Person> xmlParser(InputStream in) throws Exception {
List<Person> 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<Person>();
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<Person> 集合放入XML文件中
* @param persons 要寫入XML的List<Person>集合
* @param os 寫入到哪裏
* @throws Exception
*/
public static void createXML(List<Person> 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();
}
}</span>
3、XmlParserTest .java文件
<span style="font-size:12px;">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<Person> 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<Person>集合到XML文件中是否正確
*/
public void test2(){
List<Person> persons = new ArrayList<Person>();
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();
}
}
}</span>
將 List<person>內容寫到XML文件,我是將XML文件存入了本地SD中,原因:
1、assets目錄下,不可寫;
2、真機未root,無法訪問data/data目錄;
3、模擬器需要下載,太麻煩了,而且電腦本身有些慢。