android 客户端和后台服务器交互数据使用XML格式的时候,我们会想到DOM解析器,SAX解析器,但是DOM解析在解析XML文档时是将整个文档加载到内存中进行解析这样操作是方便了,但是太消耗资源,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。

在android系统提供的Pull解析器,它提供了类似的事件,如: 开始元素和结束元素事件,使用parser.next() 可以进入下一个元素并触发相应事件。跟 SAX 不同的 是, Pull 解析器产生的事件是一个数字,而非方法,因此可以使用一个 switch 对感兴趣的事件 进行处理。当元素开始解析时,调用 parser.nextText() 方法可以获取下一个 Text 类型节点的值。


private List<Person> parseXML(InputStream in) {List<Person> list = null;Person person = null;try {XmlPullParser newPullParser = XmlPullParserFactory.newInstance().newPullParser();// XmlPullParser parse = Xml.newPullParser(); 另一种方法// 设置读取路径和编码newPullParser.setInput(in, "utf-8");int eventType = newPullParser.getEventType();while (eventType != XmlPullParser.END_DOCUMENT) {switch (eventType) {case XmlPullParser.START_DOCUMENT:break;case XmlPullParser.START_TAG:String name = newPullParser.getName();if(TextUtils.equals("persons", name)) {list = new ArrayList<Person>();} else if(TextUtils.equals("person", name)) {person = new Person();String id = newPullParser.getAttributeValue(null, "id");person.setId(Integer.parseInt(id));} else if(TextUtils.equals("name", name)) {String personName = newPullParser.nextText();person.setName(personName);} else if(TextUtils.equals("age", name)) {String age = newPullParser.nextText();person.setAge(Integer.parseInt(age));}break;case XmlPullParser.END_TAG:String endTagName = newPullParser.getName();if(TextUtils.equals("person", endTagName)) {list.add(person);}break;case XmlPullParser.END_DOCUMENT:break;default:break;}eventType = newPullParser.next();}} catch (XmlPullParserException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return list;}public void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.createXMl:File file = new File(Environment.getExternalStorageDirectory(), "persons.xml");try {FileOutputStream out = new FileOutputStream(file);createXML(out);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}break;case R.id.parseXML:File fileIn = new File(Environment.getExternalStorageDirectory(), "persons.xml");try {FileInputStream in = new FileInputStream(fileIn);List<Person> list = parseXML(in);for(Person person : list) {Log.i("MainActivity", person.toString());}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}break;default:break;}}public class Person {public int id;public String name;public int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";}}private void createXML(OutputStream os) {try {// 创建XML生成器XmlSerializer serializer = XmlPullParserFactory.newInstance().newSerializer();// XmlSerializer newSerializer = Xml.newSerializer(); 另一种方法// 设置输出路径和编码serializer.setOutput(os, "utf-8");// 开始文档serializer.startDocument("utf-8", null);// 开始标记serializer.startTag(null, "persons");serializer.startTag(null, "person");// 设置属性serializer.attribute(null, "id", "1");serializer.startTag(null, "name");// 赋值serializer.text("张三");serializer.endTag(null, "name");serializer.startTag(null, "age");serializer.text("18");serializer.endTag(null, "age");serializer.endTag(null, "person");serializer.startTag(null, "person");serializer.attribute(null, "id", "2");serializer.startTag(null, "name");serializer.text("李四");serializer.endTag(null, "name");serializer.startTag(null, "age");serializer.text("30");serializer.endTag(null, "age");serializer.endTag(null, "person");serializer.startTag(null, "person");serializer.attribute(null, "id", "3");serializer.startTag(null, "name");serializer.text("王武");serializer.endTag(null, "name");serializer.startTag(null, "age");serializer.text("108");serializer.endTag(null, "age");serializer.endTag(null, "person");// 结束标记serializer.endTag(null, "persons");// 结束文档serializer.endDocument();} catch (XmlPullParserException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

更多相关文章

  1. [置顶] Android 界面滑动实现---Scroller类 从源码和开发文档中
  2. Android提交Http请求时,显示对话框进度条并修改UI元素
  3. Android文档 webview翻译
  4. Android - 事件分发机制
  5. Android 界面滑动实现---Scroller类 从源码和开发文档中学习(让你
  6. android 4.0.x Home键事件拦截/监听
  7. Android—API中文文档
  8. Android:处理触摸事件

随机推荐

  1. Android/java 多线程(五)-ThreadPoolExec
  2. android中padding和margin的区别
  3. (Android)react-native更改状态栏文字和图
  4. Android完全退出应用程序
  5. Android(安卓)Error:Execution failed fo
  6. Android(安卓)Studio连接STF失效
  7. android获取textview的行数
  8. Android(安卓)AES加密算法及事实上现
  9. Android禁止EditText自动弹出软键盘的方
  10. Android各类资源收集(持续更新中...)