1.SAX解析SAX特点:优点:不用实现调入整个文档,占用资源少。尤其在嵌入式环境中,如android,极力推荐使用SAX解析。
缺点:不像DOM解析一样将文档长期驻留在内存中,数据不是持久的。如果事件过后没有保存数据,数据就会丢失。SAX解析XML文档采用事件驱动模式。什么是事件驱动模式?它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理。基于事件驱动的处理模式主要是基于事件源和事件处理器(或者叫监听器)来工作的。一个可以产生事件的对象叫做事件源,而一个可以针对事件做出响应的对象就被叫做事件处理器。
使用:继承DefaultHandler类 需要重写的方便 :characters(),endDocument(),endElement(),startElement(),startDocument()
使用sax来解析代码
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(inStream, this);
2.DOM解析
特点:
DOM解析XML会将XML文件的所有内容以文档树方式存放在内在中,然后允许您使用DOMAPI遍历XML树、检索所需的数据。因为DOM需要将XML文件的所有内容以文档树方式存入在内在中,所以内在的消耗比较大。
3.Pull解析
Pull解析和Sax解析相似,提供了类似的事件。
使用方式:
XmlPullParser parser = Xml.newPullParser(); parser.setInput(FileInputStream, "UTF-8"); int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { String name = parser.getName(); switch (eventType) { case XmlPullParser.START_DOCUMENT: persons = new ArrayList<Ch05Ex03.Person>(); break; case XmlPullParser.START_TAG: if ("person".equals(name)) { person = new Person(); } else if ("id".equals(name)) { person.id = Integer.valueOf(parser.nextText()); } else if ("name".equals(name)) { person.name = parser.nextText(); } else if ("age".equals(name)) { person.age = Integer.valueOf(parser.nextText()); } break; case XmlPullParser.END_TAG: if ("person".equals(name)) { persons.add(person); person = null; } break; } eventType = parser.next(); }
4.Pull生成XML
FileOutputStream outStream = null;
try {
File file1 = new File(Environment.getExternalStorageDirectory()
+ File.separator + "cgh" + File.separator);
if (!file1.exists())
file1.mkdir();
File file2 = new File(file1, "a.xml");
outStream = new FileOutputStream(file2);
// 生成XML
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(outStream, "UTF-8");
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "persons");
// 循环List取数据
for (Person p : persons) {
serializer.startTag(null, "person");
serializer.startTag(null, "id");
serializer.text(p.id + "");
serializer.endTag(null, "id");
serializer.startTag(null, "name");
serializer.text(p.name + "");
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(p.age + "");
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
Toast.makeText(this, "生成XML完成", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Log.e(tag, e.getMessage());
e.printStackTrace();
} finally {
try {
if (outStream != null)
outStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
5.SharedPreferences存储数据
SharedPreferences sp = this.getSharedPreferences("b", Context.MODE_APPEND);
Editor editor = sp.edit();
editor.putString("name", name.getText() + "");
editor.putString("age", age.getText() + "");
editor.commit();