这三种方法中DOM最耗内存,因为它是把整个文件加载进去然后进行分类整理的,PULL和SAX类似,只是SAX要用到一个解析类,类中的主要三个方法完成内容的解析。
》Sax定义
SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于android等移动设备
SAX全称是Simple API for Xml,既是指一种接口,也是一个软件包
作为接口,sax是事件驱动型xml解析的一个标准接口,android的事件机制是基于回调函数
》Sax特点
1. 解析效率高,占用内存少
2.可以随时停止解析
3.不能载入整个文档到内存
4.不能写入xml
5.SAX解析xml文件采用的是事件驱动
---sax并不需要解析完 整个文档,在按内容顺序解析文档的过程中,sax会判断当前读到的字符是否合法xml语法中的某部分,如果符合就会触发事件
》Sax工作原理
Sax的工作原理简单的说,就是对文档进行顺序扫描,扫描到文档(document)开始与结束,扫描到元素(element)开始、结束等地方时调用事件处理
处理函数做相应动作,然后继续扫描,直到文档结束。
》Sax解析文档过程
1.继承DefaultHandler ,并实现方法
2.创建SAX解析器工厂
3.获得解析器
4.获得输入流
5.使用输入流,和实现接口作参数,调用解析器的解析方法进行解析
》defaultHandler 接口是实现contentHandler接口
ContentHandler接口中的常用方法
>startDocument()
当遇到文档开头的时候,调用这个方法,可以在其中做一些与准备工作
>endDocument()
当文档结束的时候,调用这个方法,可以在其中做一些善后工作
>startElement(String namespaceURL, String localName, String qName, Attributes atts)
当读到一个开始标签的时候,会触发这个方法。namespaceURL就是命名空间,localName是不带命名空间前缀的标签名,
qName是待命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。
>endElement(String uri, String localName, String name)
当遇到结束标签的时候,调用这个方法
>characters(char[] ch, int start, int length)
这个方法用来处理在xml文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,
使用new String(ch, start, length)就可以获取内容
》DOM简介
dom全称Document Object Model ,为xml文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个主流内存的树结构,
然后代码就可以使用dom接口来操作这个树结构
》DOM的特点
>优点
1.整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能
2.通过树形结构存取xml文档
3.可以在树的某个节点上向前或向后移动
>缺点
1.将整个文档调入内存(包括无用的节点),浪费时间和空间
>适用场合
一旦解析了文档还需多次访问这些数据;硬件资源充足(内存,cpu)
》DOM解析步骤
1.创建解析器工厂
2.获得解析器工厂
3.接受一个xml文档作为输入参数名,并得到一个xml的文档对象(Document)
4.操作文档对象
》pull解析器简介
1.pull解析器是android内置的解析器,解析原理与sax类似
2.pull它提供了类似的事件。
如:开始元素和结束元素事件,使用parse.next()可以进入下一个元素并触发相应的事件,事件将作为数值代码被发送
因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法获取下一个Text类型节点的值
》pull与sax的不同之处
1.pull读取xml文件后触发相应的事件调用方法返回的是数字。
2.pull可以在程序中控制,想解析到哪里就可以停止到哪里
》pull解析步骤
1.创建解析器对象
XmlPullParser paser = Xml.newPullParser();
2.进行解析
paser.setInput(input,"utf-8");
3.产生第一个解析事件
int eventType = paser.getEventType();
4.可以使用循环判断是否继续解析
while(eventType!=XmlPullParser.END_DOCUMENT){}
首先我们准备好我们要解析的资源文件和封装好的javaBean。
person.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <persons>
- <person id="1">
- <name>sax</name>
- <age>12</age>
- </person>
- <person id="2">
- <name>ganganrou</name>
- <age>17</age>
- </person>
- <person id="3">
- <name>nuanwozi</name>
- <age>5</age>
- </person>
- </persons>
封装好的javaBean- public class PersonBean {
- int id;
- String name;
- String 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 String getAge() {
- return age;
- }
-
- public void setAge(String age) {
- this.age = age;
- }
-
- @Override
- public String toString() {
- return "PersonBean [id=" + id + ", name=" + name + ", age=" + age + "]";
- }
-
- }
接下来我们分别以DOM、SAX、PULL的方式对person.xml文件进行解析并封装到javaBean中去:一、DOM
- public static List<PersonBean> getPersonBeans() {
- List<PersonBean> list = new ArrayList<PersonBean>();
- DocumentBuilderFactory builderFactory = DocumentBuilderFactory
- .newInstance();
- try {
- DocumentBuilder builder = builderFactory.newDocumentBuilder();
- Document document = builder.parse(DomPaserHelper.class
- .getClassLoader().getResourceAsStream("person2.xml"));
- Element element = document.getDocumentElement();
- NodeList nodeList = element.getElementsByTagName("person");
-
- for (int i = 0; i < nodeList.getLength(); i++) {
- Element node = (Element) nodeList.item(i);
- PersonBean bean = new PersonBean();
- bean.setId(Integer.valueOf(node.getAttribute("id")));
-
- NodeList list2 = node.getChildNodes();
- for (int j = 0; j < list2.getLength(); j++) {
-
- Node element2 = list2.item(j);
-
- <span style="color:#ff6600;">
- if (element2.getNodeType() == Node.ELEMENT_NODE) {
- Element childElement = (Element) element2;
-
- if ("name".equals(childElement.getNodeName())) {
- bean.setName(childElement.<span style="color:#ff6600;">getFirstChild</span>()
- .getNodeValue());
- }
-
- if ("age".equals(childElement.getNodeName())) {
- bean.setAge(childElement.<span style="color:#ff6600;">getFirstChild</span>()
- .getNodeValue());
- }
- }
- }
- list.add(bean);
- }
-
- } catch (Exception e) {
-
- e.printStackTrace();
- }
-
- return list;
- }
二、PULL- public static List<PersonBean> getPersonBeans() {
- List<PersonBean> list = null;
- boolean f = false;
- PersonBean bean = null;
- XmlPullParserFactory pullParserFactory;
- try {
-
- pullParserFactory = XmlPullParserFactory.newInstance();
- XmlPullParser parser = pullParserFactory.newPullParser();
- parser.setInput(PullPaserHelper.class.getClassLoader()
- .getResourceAsStream("person3.xml"), "utf-8");
- int tag = parser.getEventType();
- while (tag != XmlPullParser.END_DOCUMENT) {
- switch (tag) {
- case XmlPullParser.START_DOCUMENT:
- list = new ArrayList<PersonBean>();
- break;
- case XmlPullParser.START_TAG:
- String str = parser.getName();
-
- if (str.equals("person")) {
- bean = new PersonBean();
- bean.setId(Integer.valueOf(parser.getAttributeValue(0)));
- f = true;
- }
- if (f&&bean!=null) {
- if ("name".equals(str)) {
- bean.setName(parser.nextText());
- }
- if ("age".equals(str)) {
- bean.setAge(parser.nextText());
- }
- }
- break;
- case XmlPullParser.END_TAG:
- String con = parser.getName();
- if (con.equals("person") && bean != null) {
- list.add(bean);
- bean = null;
- f = false;
- }
-
- break;
-
- default:
- break;
- }
- tag = parser.next();
-
- }
-
- } catch (Exception e) {
-
- e.printStackTrace();
- }
-
- return list;
- }
首先,获取一个单例XmlPullParserFactory,然后newPullParser得到一个XmlPullParser对象。用setInput将服务器返回的xml设置进去,开始解析。通过getEventType得到int型的当前的解析对象,在while循环中不断进行解析,如果eventType不等于END_DOCUMENT,说明解析没完成,调用next()获取下一个解析事件继续解析。在while循环中,通过getName得到节点名字,用Switch进行判断,如果发现节点名字等于id或name,就用nextText获取节点内的具体内容。
三、SAX- public class SaxHanderHelper extends DefaultHandler {
-
- List<PersonBean> personBeans;
- String tag;
-
- public List<PersonBean> getPersonBeans() {
- return personBeans;
- }
-
- public SaxHanderHelper() {
-
- personBeans = new ArrayList<PersonBean>();
- }
-
- PersonBean bean;
-
- @Override
- public void startElement(String uri, String localName, String qName,
- Attributes attributes) throws SAXException { //开始解析某个节点时调用
-
- if (localName.equals("person")) {
- bean = new PersonBean();
- for (int i = 0; i < attributes.getLength(); i++) {
- bean.setId(Integer.valueOf(attributes.getValue(i)));
- }
- }
- tag = localName; //记录当前节点名
- }
-
- @Override
- public void endElement(String uri, String localName, String qName)
- throws SAXException {
-
- if (localName.equals("person") && bean != null) {
- personBeans.add(bean);
- bean = null;
- }
- tag = null;
- }
-
- @Override
- public void characters(char[] ch, int start, int length)
- throws SAXException {
-
- String content = new String(ch, start, length).trim();
- if (tag != null) {
- if (tag.equals("age")) {
- bean.setAge(content);
- }
- if (tag.equals("name")) {
- bean.setName(content);
- }
- }
-
- }
-
- }
首先,新建一个ContentHandler类继承自DefaultHandler,并重写5个方法。得到一个单例SAXParserFactory,调用facto的newSAXParser().getXMLReader()得到一个XMLReader对象。调用reader的setContentHandler并将handler传入。用parse开始执行解析。
调用方法:
- SAXParser saxParser = factory.newSAXParser();
- SaxHanderHelper handerHelper = new SaxHanderHelper();
- saxParser.parse(getInputStream(), handerHelper);
- List<PersonBean> beans = handerHelper.getPersonBeans();
0 0