Android学习札记(9)XML文件解析
XML(可扩展标记语言)
通常有两种方式对XML文件今夕解析,分别是SAX和DOM(文档对象模型)
DOM方式
原理:首先要把XML文档全部装载到内存,然后把XML文档解析成一棵树,有根节点、子节点、叶节点。在这棵树上进行相关的操作,比如添加、删除节点等。
优点: 操作起来简单方便
缺点:如果XML文档比较大,性能上就会存在问题。
一、SAX概念
SAX-Simple API for XML
SAX既是指一种接口,也是指一个软件包。作为接口,SAX是事件驱动型XML解析的一个标准接口。
优点: 逐行扫描XML文档,一边扫描一边解析,可以随时停止解析。
缺点: 对XML进行操作比较复杂。
二、SAX基本原理
SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
大多数SAX实现都会产生以下类型的事件:
1、在文档的开始和结束时触发文档处理事件。
2、在文档内每一XML元素接受解析的前后触发元素事件。
3、任何元数据通常都由单独的事件交付。
4、在处理文档的DTD或Schema时产生DTD或Schema事件。
5、产生错误事件用来通知主机应用程序解析错误。
三、SAX常用接口
ContentHandler接口
ContentHandler是Java类包中一个特殊的SAX接口,位于org.xml.sax包中。该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。
ContentHandler接口的方法有以下几种:
void startDocument() void endDocument() void startElement(String uri, String localName, String qName, Attributes atts) void endElement(String uri, String localName, String qName) void characters(char[ ] ch, int start, int length)
DTDHandler接口
DTDHandler用于接收基本的DTD相关事件的通知。该接口位于org.xml.sax包中。此接口仅包括DTD事件的注释和未解析的实体声明部分。SAX解析器可按任何顺序报告这些事件,而不管声明注释和未解析实体时所采用的顺序;但是,必须在文档处理程序的startDocument()事件之后,在第一个startElement()事件之前报告所有的DTD事件。
DTDHandler接口包括以下两个方法
void startDocumevoid notationDecl(String name, String publicId, String systemId) nt() void unparsedEntityDecl(String name, String publicId, String systemId, String notationName)
EntityResolver接口
EntityResolver接口是用于解析实体的基本接口,该接口位于org.xml.sax包中。
该接口只有一个方法,如下:
public InputSource resolveEntity(String publicId, String systemId)
解析器将在打开任何外部实体前调用此方法。此类实体包括在DTD内引用的外部DTD子集和外部参数实体和在文档元素内引用的外部通用实体等。如果SAX应用程序需要实现自定义处理外部实体,则必须实现此接口。
ErrorHandler接口
ErrorHandler接口是SAX错误处理程序的基本接口。如果SAX应用程序需要实现自定义的错误处理,则它必须实现此接口,然后解析器将通过此接口报告所有的错误和警告。
该接口的方法如下:
void error(SAXParseException exception) void fatalError(SAXParseException exception) void warning(SAXParseException exception)
创建SAX解析器
(1)用系统默认值来创建一个XMLReader(解析器):
XMLReader reader = XMLReaderFactory.createXMLReader();
(2)从给定的类名称来创建一个XMLReader :
XMLReader reader = XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.SAXParser");
(3)使用javax.xml.parsers包中的SAXParserFactory类和SAXParser类创建:
SAXParserFactory spFactory = SAXParserFactory.newInstance(); SAXParser sParser = spFactory.newSAXParser();
DefaultHandler类
DefaultHandler类是SAX2事件处理程序的默认基类。它实现了EntityResolver、DTDHandler、ContentHandler和ErrorHandler这四个接口。包含这四个接口的所有方法,所以我们在编写事件处理程序时,可以不用直接实现这四个接口,而继承该类,然后重写我们需要的方法。
如下:
import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; public class TestDefaultHandler extends DefaultHandler{ public void startDocument() throws SAXException{ System.out.println("开始解析!"); } public void endDocument() throws SAXException{ System.out.println("解析完成!"); } public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { System.out.println("元素名:"+qName); } public void endElement(String uri, String localName, String qName) throws SAXException{ System.out.println("对"+qName+"的解析完成!"); } }
XMLReader接口
XMLReader接口是使用回调读取XML文档的接口。XMLReader是XML解析器的SAX2驱动程序必须实现的接口。此接口允许应用程序设置和查询解析器中的功能和属性,注册文档的事件处理程序,以及对文档的解析。如下
import org.xml.sax.*; import org.xml.sax.helpers.*; public class TestXMLReader{ public TestXMLReader(){ try{ XMLReader reader = XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.SAXParser"); System.out.println("创建解析器成功!"); //MyContentHandler是实现了ContentHandler接口的类 reader.setContentHandler(new MyContentHandler()); reader.setDTDHandler(new MyDTDHandler()); //对test.xml进行解析 reader.parse("test.xml"); System.out.println("解析完成!"); }catch(SAXException e){e.printStackTrace();} } }
SAX (Sampling and Analytical Quality Control Scheme),采样分析全过程质量控制。是近些年发展起来的另一种全程质量控制方法。SAX要求采集平行样品,并对每个样品进行平行分析,并在最后用方差分析这一统计手段把采样和分析过程的偶然误差分别以方差形式定量表示。这一全程质量控制方法首先被用于地球化学研究中分析数据中,后来广泛于植物、土壤环境分析质量控制中