总结:1.xml 存在的意义:在Android系统应用中一些数据存放在xml文件中2.xml 的解析方式(Android系统中)有:PULL + SAX + DOM3.在Android系统中的xml解析使用的技术就是PULL,所以以后的应用中尽量使用PULL,此PULLjava开源项目(org.xmlpull.v1)已经集成至Android系统中,无需导入JAR包4.在应用中使用的xml文件放置与Src目录下,当程序启动是类加载器就会快速的访问到xml文件中的内容 InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");5.xml 基础 <?xml version="1.0" encoding="UTF-8"?> : start xml documentnode 类型 :Element / Text6.PULL的解析方式与SAX相似: char [] firstLine = {<?xml version="1.0" encoding="UTF-8"?> } 在此产生触发解析事件 start parse……7.使用PULL解析时触发的四种事件:1.while (event != pullParser.END_DOCUMENT) { switch (event) {case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG: break;
case XmlPullParser.END_TAG:
break;
event = pullParser.next();// 让指针指向node (node 分为 Element & Text)}
}在Android中生成xml文件有两种:面向对象 & 非面向对象
1.面向对象
2.非面向对象:
StringBuilder xml = new StringBuilder() xml.append("<?xml version="1.0" encoding="UTF-8"?>");
XmlSerializable serializable = Xml.newSerializalbe();
serializable.setOutput("utf-8"); serializable.startDocument("utf-8",true) //(encoding ,stonelone) serializable.startTag(null,"persons");
serializable.endiiTag(null,"persons");
serializable.endDocument();
代码清单
1.ParseXmlService.java
package com.hisoft.service; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer; import android.util.Xml; import com.hisoft.domain.Person; public class ParseXmlService { private static final String ENCODING = "utf-8"; /** * 解析xml文件中的数据 * * @param xml 读取xml文件的输入流 * @throws Exception */ @SuppressWarnings("static-access") public static List<Person> getPersons(InputStream xml) throws Exception { // XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();//通过 XmlPullParserFactory获得一个解析器 XmlPullParser pullParser = Xml.newPullParser();//android.util.Xml包 pullParser.setInput(xml, ENCODING); List<Person> personList = null; Person person = null; int event = pullParser.getEventType(); while (event != pullParser.END_DOCUMENT) { switch (event) { case XmlPullParser.START_DOCUMENT: personList = new ArrayList<Person>(); break; case XmlPullParser.START_TAG: if ("person".equals(pullParser.getName())) { int id = Integer.valueOf(pullParser.getAttributeValue(0)); person = new Person(); person.setId(id); } if ("name".equals(pullParser.getName())) { String name = pullParser.nextText();// 返回name节点后面的Text // return String person.setName(name); } if ("age".equals(pullParser.getName())) { int age = Integer.valueOf(pullParser.nextText()); person.setAge(age); } break; case XmlPullParser.END_TAG: if ("person".equals(pullParser.getName())) { personList.add(person); person = null;// 为了不影响下一个person对象 & 节省内存空间 } break; } event = pullParser.next();// 让指针指向node (node 分为 Element & Text) } return personList; } /** * 以xml格式存储数据 * * @param os //要写入的文件的文件流 * @param personList //要写入xml文件的内容 * @throws Exception */ public static void createXml(OutputStream os, List<Person> personList) throws Exception { XmlSerializer serializer = Xml.newSerializer(); serializer.setOutput(os, ENCODING);//设置xml文件的字符集为 UTF-8 serializer.startDocument(ENCODING, true);// 设置xml开始标记 <?xml version="1.0" encoding="UTF-8"?> serializer.startTag(null, "persons"); // 生成person Element for (Person person : personList) { // person serializer.startTag(null, "person");// 生成person 节点 // id serializer.attribute(null, "id", String.valueOf(person.getId()));// 生成 id属性 // name serializer.startTag(null, "name");// 生成 name 节点 serializer.text(person.getName());// 添加 name 值 serializer.endTag(null, "name");// 結束 name Element // age serializer.startTag(null, "age");// 生成name 节点 serializer.text(String.valueOf(person.getAge()));// 添加 age 值 serializer.endTag(null, "age");// 結束 age Element serializer.endTag(null, "person");// 結束 person Element } serializer.endTag(null, "persons");// 結束 persons Element serializer.endDocument();// 结束xml文档 os.flush();//不要忘了把输出流关闭 os.close(); } }
2.person.xml
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="1"> <name>1111</name> <age>11</age> </person> <person id="2"> <name>2222</name> <age>22</age> </person> <person id="3"> <name>3333</name> <age>33</age> </person> </persons>
3.TestXmlParserService.java // UT测试类
package com.hisoft.test; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import android.test.AndroidTestCase; import android.util.Log; import com.hisoft.domain.Person; import com.hisoft.service.ParseXmlService; public class TestXmlParserService extends AndroidTestCase { private static final String TAG = "TestXmlParserService"; public void testGetPersons() throws Exception { InputStream xml = this.getClass().getClassLoader() .getResourceAsStream("person.xml"); List<Person> list = ParseXmlService.getPersons(xml); for (Person person : list) { Log.i(TAG, person.toString()); } } public void testSaveXml() throws Exception { List<Person> personList = new ArrayList<Person>(); personList.add(new Person(1,"1111",11)); personList.add(new Person(2,"2222",22)); personList.add(new Person(3,"3333",33)); File xmlFile = new File( sDir(),"person.xml"); FileOutputStream fos = new FileOutputStream(xmlFile); ParseXmlService.createXml(fos, personList); } }
4.person.java
package com.hisoft.domain; public class Person { private int id; private String name; private int age; public Person(){ super(); } public Person(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } ……