上一文中总结了dom解析xml文档的方式,本文开始总结使用SAX解析xml 的方式及它的优缺点!
SAX(Simple API for XML),是指一种接口,或者一个软件包.
首先我们应该知道SAX解析和dom解析的区别:
dom是树结构解析,易于理解和开发,它可以随意访问文件所在的节点位置,易于修改,删除和查询。但对于dom文档过大时,则会解析较慢。
而SAX解析是事件推动型,顺序读取文件的节点,且只能读取文档的内容,不能对文档的内容进行修噶,对文档的大小没有过多的限制,但开大复杂度较高,
下面介绍一个SAX解析xml文档的几个关键步骤:
(1)、创建XML解析处理器,即SAXParseFactory 的实例,
SAXParserFactory factory = SAXParserFactory.newInstance();
(2)、通过factory创建SAX解析器
SAXParser parser = factory.newSAXParser();
(3)、通过SAXParse 的实例,创建xml解析处理器。对文档进行解析,
parser.parse(uri,handler) 方法有两个参数uri , handler对象,uri就是我们的文档的路径,
接下来我们需要创建一个handler对象,我们创建一个Myhandler类,这个Myhandler类需要继承DefaultHandler类,
Myhandler handler = new Myhandler();
下面是我们的Myhandler的实例代码。
1 packagecom.imooc.handler;2
3 importorg.xml.sax.Attributes;4 importorg.xml.sax.SAXException;5 importorg.xml.sax.helpers.DefaultHandler;6
7 /*
8 * 解析xml处理器9 *10 **/
11 public class Myhandler extendsDefaultHandler{12 String value = null;13 /**
14 * 用来标识解析开始15 */
16 @Override17 public void startDocument() throwsSAXException {18 //TODO Auto-generated method stub
19 super.startDocument();20 System.out.println("SAX解析开始");21 }22
23 /**
24 * 用来标识解析结束25 */
26 @Override27 public void endDocument() throwsSAXException {28 //TODO Auto-generated method stub
29 super.endDocument();30 System.out.println("SAX解析结束");31 }32
33 /**
34 * 解析xml元素35 */
36 @Override37 public voidstartElement(String uri, String localName, String qName,38 Attributes attributes) throwsSAXException {39 //TODO Auto-generated method stub
40 super.startElement(uri, localName, qName, attributes);41 if (qName.equals("book")) {42 int num =attributes.getLength();43 for(int i = 0; i < num; i++){44 System.out.print("book元素的第" + (i + 1) + "个属性名是:"
45 +attributes.getQName(i));46 System.out.println("---属性值是:" +attributes.getValue(i));47
48 }49 }else if (!qName.equals("name") && !qName.equals("bookstore")) {50
51 System.out.print("节点名是:" + qName + "---");52 }53 }54
55 @Override56 public voidendElement(String uri, String localName, String qName)57 throwsSAXException {58 //TODO Auto-generated method stub
59 super.endElement(uri, localName, qName);60
61 }62
63 @Override64 public void characters(char[] ch, int start, intlength)65 throwsSAXException {66 //TODO Auto-generated method stub
67 super.characters(ch, start, length);68 value = newString(ch, start, length);69 if (!value.trim().equals("")) {70 System.out.println("节点值是:" +value);71 }72 }73
74
75
76 }
(4)、测试主程序入口
1 public static voidmain(String[] args) {2
3 SAXParserFactory factory =SAXParserFactory.newInstance();4
5 try{6 SAXParser parser =factory.newSAXParser();7
8 Myhandler handler = newMyhandler();9 parser.parse("books.xml", handler);10
11 } catch(ParserConfigurationException e) {12 //TODO Auto-generated catch block
13 e.printStackTrace();14 } catch(SAXException e) {15 //TODO Auto-generated catch block
16 e.printStackTrace();17 } catch(IOException e) {18 //TODO Auto-generated catch block
19 e.printStackTrace();20 }21 }
books.xml文件,
1 <?xml version="1.0" encoding="UTF-8"?>
2
3
4 老人与海
5 海明威
6 1955
7 45
8
9
10 书剑恩仇录
11 1959
12 24
13 chinese
14
15
输出的结果为:
SAX解析开始
book元素的第1个属性名是:id---属性值是:1节点值是:老人与海
节点名是:author---节点值是:海明威
节点名是:year---节点值是:1955节点名是:price---节点值是:45book元素的第1个属性名是:id---属性值是:2节点值是:书剑恩仇录
节点名是:year---节点值是:1959节点名是:price---节点值是:24节点名是:language---节点值是:chinese
SAX解析结束
这样我们就完成了最基本的SAX解析xml文档。
总结:
优点:对内存要求比较低,对文档中的部分数据来进行解析开发速度快,而且扩展能力强。
缺点:用SAX方式进行XML解析时,需要顺序执行,所以很难访问到同一文档中的不同数据.此外,在基于该方式的解析编码过程也相对复杂