XML编程总结(三)——使用SAX接口操作xml

(三)使用SAX接口操作xml

SAX解析器被称为SAXParser,SAXParser是由javax.xml.parsers.SAXParserFactory创建的。与DOM解析器不同,SAX解析器并不创建XML文档的内存表示,因此会占用更少的内存。SAX解析器通过调用回调方法(事件驱动)将XML文档结构通知客户端,也就是通过调用提供给SAXParser的org.xml.sax.helpers.DefaultHandler处理器内的方法。

org.xml.sax.helpers.DefaultHandler类实现了ContentHandler、ErrorHandler、DTDHandler以及EntityResolver等接口。其中,回调方法是通过事件驱动来调用。最重要的方法有:

startDocument()和endDocument()方法,遇到XML文档的开始和结束时被调用;

startElement()和endElement()方法,遇到一个文档元素的开始和结束时被调用;

characters()方法,遇到元素的开始标签和结束标签之间的文本数据时被调用。

因此,程序员只需继承org.xml.sax.helpers.DefaultHandler该类,并实现该类的回调方法即可。

测试类代码:

 1 public class SAXTest {
 2     @Test
 3     public void testRetrieve() throws Exception{
 4         //创建SAXParser的工厂
 5         SAXParserFactory factory=SAXParserFactory.newInstance();
 6         //创建SAXParser解析器对象
 7         SAXParser parser = factory.newSAXParser();
 8         //获得xml文档的输入流
 9         InputStream is=SAXTest.class.getClassLoader().getResourceAsStream("books.xml");
10         //利用Handler对文档进行解析
11         parser.parse(is, new TechDefaultHandler());
12         //获得文档的读对象
13         XMLReader reader = parser.getXMLReader();
14     }
15 }

DefaultHandler的子类代码:

 1 public class TechDefaultHandler extends DefaultHandler {
 2     // 使用栈这个数据结构来保存
 3     private Stack<String> stack = new Stack<String>();
 4
 5     // 数据
 6     private String title;
 7     private String author;
 8     private String year;
 9     private double price;
10
11     /**
12      * 遇到文档开始元素时调用
13      */
14     @Override
15     public void startDocument() throws SAXException {
16         System.out.println("startDocument");
17
18     }
19
20     /**
21      * 遇到文档结束元素时调用
22      */
23     @Override
24     public void endDocument() throws SAXException {
25         System.out.println("endDocument");
26     }
27
28     /**
29      * 遇到元素开始元素时调用
30      * 获取属性为web的book元素的price元素文本
31      */
32     @Override
33     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
34         // 将标签名压入栈
35         stack.push(qName);
36
37         // 处理属性
38         for (int i = 0; i < attributes.getLength(); ++i)
39         {
40             String attrName = attributes.getQName(i);
41             String attrValue = attributes.getValue(i);
42
43             System.out.println("属性: " + attrName + "=" + attrValue);
44
45         }
46
47     }
48
49     /**
50      * 遇到元素结束元素时调用
51      */
52     @Override
53     public void endElement(String uri, String localName, String qName) throws SAXException {
54         stack.pop();// 表示该元素解析完毕,需要从栈中弹出标签
55
56         if ("book".equals(qName)) {
57             System.out.println("Book info: -------");
58             System.out.println("    title: " + title);
59             System.out.println("    author: " + author);
60             System.out.println("    year: " + year);
61             System.out.println("    price: " + price);
62             System.out.println();
63         }
64     }
65
66     /**
67      * 遇到文档节点时调用
68      */
69     @Override
70     public void characters(char[] ch, int start, int length) throws SAXException {
71         // 取出标签名
72         String tag = stack.peek();
73
74         if ("title".equals(tag))
75         {
76             title = new String(ch, start, length);
77
78         }
79         else if ("author".equals(tag))
80         {
81             author = new String(ch, start, length);
82         }
83         else if ("year".equals(tag))
84         {
85             year = new String(ch, start, length);
86         }
87         else if ("price".equals(tag))
88         {
89             price = Double.parseDouble(new String(ch, start, length));
90         }
91
92     }
93
94     @Override
95     public void error(SAXParseException e) throws SAXException {
96         System.out.println(e.getMessage());
97     }
98
99 }
时间: 2024-10-25 06:21:09

XML编程总结(三)——使用SAX接口操作xml的相关文章

XML编程总结(五)——使用StAX接口操作xml

(五)使用StAX接口操作xml StAX,全称Streaming API for XML,一种全新的,基于流的JAVA XML解析标准类库.其最终版本于 2004 年 3 月发布,并成为了 JAXP 1.4(将包含在即将发布的 Java 6 中)的一部分.在某种程度上来说,StAX与SAX一样是基于XML事件的解析方式,它们都不会一次性加载整个XML文件.但是它们之间也有很大的不同. StAX和SAX的区别——拉式解析器和推式解析器的区别 虽然StAX与SAX一样基于XML事件解析,相比于DO

XML编程总结(二)——使用DOM接口操作xml

(二)使用DOM接口操作xml DOM解析器将整个XML文档加载到内存中,使用DOM模型对XML文档在内存中建模.DOM解析器被称为DocumentBuilder,它位于javax.xml.parsers包下.下面是使用DOM对xml文档进行CRUD操作的演示. 测试类代码:Source和Result接口的使用,将内存中xml模型输出 1 public class DomTest { 2 private Document document; 3 4 @Before 5 public void s

XML编程总结(一)——目录

本系列文章对Java领域中常用的几种操作XML的编程方式进行归纳,归纳的知识属于基础范畴,概括的不全面.主要通过实例操作方法进行演示,原理部分的讲解甚少,如需请查阅详细文档资料.本文分为以下几个部分: (一)JAXP简介 (二)使用DOM接口操作xml (三)使用SAX接口操作xml (四)使用dom4j方式操作xml (五)使用StAX接口操作xml (六)使用JAXB进行java对象和xml格式之间的相互转换 (七)使用XPath对象查询xml文档 (一)JAXP简介 JAXP(Java A

XML 解析---dom解析和sax解析

目前XML解析的方法主要用两种: 1.dom解析:(Document Object Model,即文档对象模型)是W3C组织推荐的解析XML的一种方式. 使用dom解析XML文档,该解析器会先把XML文档加载到内存中,生成该XML文档对应的document对象,然后把XML文档中的各个标签元素变成相应的Element对象,文本会变成Text对象,属性会变成Attribute对象,并按这些标签.文本.属性在XML文档中的关系保存这些对象的关系. 缺点:消耗内存,所以使用dom解析XML文档时不能解

Android学习之XML数据的三种解析方式以及生成XML文件

首先,我得声明,本博客的思想主要参考了此博客:http://blog.csdn.net/liuhe688/article/details/6415593 不过代码我自己一句句敲的 好了,首先讲一下解析XML的三种方式:(恕我粘贴一下哈) SAX解析器: SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理.在事件源调用事件处理器中特定方

C#操作XML(读XML,写XML,更新,删除节点,与dataset结合等)【转载】

已知有一个XML文件(bookstore.xml)如下: Corets, Eva 5.95 1.插入节点 往节点中插入一个节点: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 XmlDocument xmlDoc=new XmlDocument(); xmlDoc.Load("bookstore.xml"); XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找

ActionScript 3操作XML 详解

AS3引入了E4X ,它是根据ECMAScript标准处理XML 数据的全新机制.这使得程序员在程序中无缝地操作XML.在AS3中可以使用XML字面值将XML数据直接写入代码,该字面值将被自动解析. 一.AS3中的XML入门 1.可以将XML直接写入代码 public var employeelist:XML=<employeelist> <employee> <name first="Conan" last="O'Brien" /&g

flex操作XML,强力总结帖

初始化XML对象 XML对象可以代表一个XML元素.属性.注释.处理指令或文本元素.在ActionScript 3.0中我们可以直接将XML数据赋值给变量: var myXML:XML =    <order>        <item id='1'>            <menuName>burger</menuName>            <price>3.95</price>        </item>  

转 四种操作xml的方式(SAX, DOM, JDOM, DOM4J)比较

四种操作xml的方式(SAX, DOM, JDOM, DOM4J)比较 (2010-10-29 15:31:28) 转载▼  http://blog.sina.com.cn/s/blog_6458bf440100mgjs.html 标签: 杂谈 分类: JAVA技术 1 介绍 引子:XML自从出现以来,以其可扩展性.自描述性.自相容性等优点,被誉为信息标准化过程的有力工具,基于XML的标准将成为以后信息标准的主流.伴随而生的是针对XML的操作技术,“名人总的有人去解析”吗!下面是愚人对目前主要的