在Android中解析XML
知识点概述:
1.DOM解析XML
2.SAX解析XML
3.Pull解析XML
知识点详述:
前序:XML是可扩展性标记语言,可以自己定义标签.在android中处理xml数据很常见,通常在不同平台传输数据的时候,就会用到xml,xml是与平台无关的特性,被广泛运用于数据通信中.android中解析xml数据通常有三种方式:DOM,SAX,PULL.
1.DOM解析XML
DOM是Document Object Model的缩写,即文档对象模型.DOM解析器是通过将XML文档解析成树状模型并将其放入内存来完成解析工作的,而后对文档的操作都是在这个树状模型上完成.这个在内存中的文档是实际文档大小的几倍.好处是结构清晰,操作方便,坏处是耗费系统资源.要使用DOM方式来解析xml,需引入下面两个包:
import javax.xml.parsers.*;//包含DOM解析器和SAX解析器的具体实现
import org.w3c.dom.*;//定义了W3C制定的DOM接口
具体思路:
*首先创建一个DocumentBuilderFactory实例,
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
*利用DocumentBuilderFactory实例创建DocumentBuilder,
DocumentBuilder builder = factory.newDocumentBuilder();
*然后加载xml文档(Document),
Document doc = builder.parse(getAssets().open("xml/student.xml"));
*然后获取文档的根节点(Element),
Element root = doc.getDocumentElement();
*然后获取根节点中所有子节点的列表(NodeList),
NodeList nodeList = root.getElementsByTagName("student");
*然后再获取子节点列表中需获取的节点.
2.SAX解析XML
SAX是Simple API for XML的缩写,SAX是基于事件驱动的,在用SAX解析xml文档时候,在读取到文档开始和结束标签时候就会回调一个事件,在读取到其它节点与内容时也会回调一个事件.事件源是org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并产生事件.事件处理器是DefaultHandler,DefaultHandler的一些主要事件回调方法如下:
与DOM比较而言,SAX是一种轻量型的方法.当需要一个速度快的解析器并且希望最大限度的减少应用程序的内存占用时,通常可以使用SAX解析.
具体思路是:
*创建SAXParserFactory对象
SAXParserFactory spf = SAXParserFactory.newInstance();
*根据SAXParserFactory.newSAXParser()方法返回一个SAXParser解析器
SAXParser sp = spf.newSAXParser();
*根据SAXParser解析器获取事件源对象XMLReader
XMLReader reader = sp.getXMLReader();
*实例化一个DefaultHandler对象
StudentHandler handler = new StudentHandler(students);
*连接事件源对象XMLReader到事件处理DefaultHander
reader.setContentHandler(handler);
*调用XMLReader的parse方法从输入源获取到xml数据
*通过DefaultHandler返回我们需要的数据集合
注:重点在于DefaultHandler对象中对每一个元素节点,属性,文本内容,文档内容的处理.
3.Pull解析XML SDK提供的xml标准解析方式
XmlPullParser解析器的运行方式与SAX解析器相似.它提供了类似的事件(开始元素和结束元素),但需要使用parser.next()方法来提取它们.事件将作为数值代码被发送,因此可以根据不同的事件代码值来进行不同的处理.通过parser.getEventType()方法来取得事件的代码值(如XmlPullParser.START_DOCUMENT、XmlPullParser.START_TAG、XmlPullParser.END_TAG).
当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值,也可调用它的nextText()获取下一个文本节点的值。
具体思路:
*构建XmlPullParser解析器
XmlPullParser parser = Xml.newPullParser();
*将xml文档注册到解析器中
parser.setInput();
*触发事件,获得事件类型码
int event = parser.getEventType();
*针对事件进行具体分析
"name".equals(parser.getName());//判断开始标签元素是否是name
parser.getAttributeValue(0);//得到标签的属性值
parser.nextText();//获取下一个Text节点的值
*触发并进入下一个事件
event = parser.next();
Pull解析和Sax解析不一样的地方有(1)pull读取xml文件后触发相应的事件调用方法返回的是数字(2)pull可以在程序中控制想解析到哪里就可以停止解析。
优点:不是一次加载,中途可以停止