﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-小菜毛毛技术分享-随笔分类-XML</title><link>http://www.blogjava.net/caizh2009/category/44321.html</link><description>与大家共同成长</description><language>zh-cn</language><lastBuildDate>Thu, 18 Mar 2010 17:26:07 GMT</lastBuildDate><pubDate>Thu, 18 Mar 2010 17:26:07 GMT</pubDate><ttl>60</ttl><item><title>SAX解析XML例子</title><link>http://www.blogjava.net/caizh2009/archive/2010/03/17/315699.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Wed, 17 Mar 2010 09:37:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/03/17/315699.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/315699.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/03/17/315699.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/315699.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/315699.html</trackback:ping><description><![CDATA[<div class="tit">用SAX解析xml文件的例子</div>
<div class="date">2008-07-15  09:46</div>
<div id="blog_text" class="cnt"><strong>1． Xml技术简介<br />
</strong>Xml文件有两种约束类型，包括文档类型定义（DTD）和Xml 模式（Schema）。Xml
DTD被包含在xml1的标准里。Xml 模式被包含在W3C的标准中。在xml 数据和xml 模式两者之间有很多的区别。<br />
A． xml模式支持的数据类型比xml DTD多；<br />
B． xml模式在无序的情况下使用起来比xml DTD更方便；<br />
C． xml模式支持名字空间，可以在不同的文件中定义相同的方法等。<br />
D． xml模式形成的文档可以被多种标准解析，如dom，sax或者jdom等，而xml DTD方式下确不行。<br />
<strong>2． Xml文件解析</strong><br />
在java语言环境里可以使用三种方法解析xml文件：dom（document object model），sax（simple api for
xml）和jdom（java document object model）。<br />
SAX提供了基于事件的方式进行解析，适合于快速，数据量小的解析情况。SAX解析有几个缺陷：A.它的解析是连续的；B.数据无法回朔。<br />
DOM解析不同于SAX。它提供了内存中完整的xml数据映像，数据被存储在树状结构中。DOM解析方式更容易获得和处理数据。<br />
JDOM是java语言中特有的，主要用来支持xpath标准。<br />
<strong>3． SAX解析方式</strong><br />
上面我简要介绍了几种解析xml文件的技术，这里我们使用SAX技术给出一个小例子，大家可以从这个例子中发现如果你能够掌握一些开源软件包，你就可以很
快掌握解析xml数据的技术。<br />
<strong>3．1制作一个简单的xml文件component.xml</strong><br />
<pre>&lt;?xml version="1.0"?&gt;<br />
&lt;XmlComponents&gt;<br />
&lt;XmlComponent&gt;<br />
&lt;ComNo&gt;1&lt;/ComNo&gt;<br />
&lt;/XmlComponent&gt;<br />
&lt;/XmlComponents&gt;</pre>
<br />
<strong>3.2下载xerces.jar软件包</strong><br />
在Apache网站上&#215;&#215;&#215;下载xerces.jar软件包，这个包中包含了上面我们列举的几种解析xml数据的API。然后将这个软件包加入到程序的
classpath中。<br />
<strong>3.3制作解析类MySaxParser.java</strong><br />
<pre>import java.io.IOException;<br />
import org.xml.sax.*;<br />
import org.xml.sax.helpers.*;<br />
import javax.xml.parsers.*;<br />
<br />
public class MySaxParser extends DefaultHandler {<br />
private static int INDENT = 2;<br />
<br />
// 运行主方法<br />
public static void main(String[] argv) {<br />
//    if (argv.length != 1) {<br />
//      System.out.println("Usage: java ds.MySaxParser [URI]");<br />
//      System.exit(0);<br />
//    }<br />
System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl");<br />
//    String uri = argv[0];<br />
String uri = "Components.xml";<br />
try {<br />
SAXParserFactory parserFactory = SAXParserFactory.newInstance();<br />
parserFactory.setValidating(false);<br />
parserFactory.setNamespaceAware(false);<br />
MySaxParser MySaxParserInstance = new MySaxParser();<br />
SAXParser parser = parserFactory.newSAXParser();<br />
parser.parse(uri, MySaxParserInstance);<br />
}<br />
catch(IOException ex) {<br />
ex.printStackTrace();<br />
}<br />
catch(SAXException ex) {<br />
ex.printStackTrace();<br />
}<br />
catch(ParserConfigurationException ex) {<br />
ex.printStackTrace();<br />
}<br />
catch(FactoryConfigurationError ex) {<br />
ex.printStackTrace();<br />
}<br />
<br />
}<br />
<br />
private int idx = 0; //indent<br />
// 处理各种分隔符号<br />
public void characters(char[] ch, int start, int length) throws SAXException {<br />
//instantiates s, indents output, prints character values in element<br />
String s = new String(ch, start, length);<br />
if (!s.startsWith("\n")) //空的value不打印<br />
System.out.println(getIndent()+ " Value: " + s);<br />
}<br />
<br />
// 处理文档尾<br />
public void endDocument() throws SAXException {<br />
idx -= INDENT;<br />
System.out.println(getIndent() + "end document");<br />
<br />
System.out.println("...PARSING ends");<br />
}<br />
<br />
// 处理标记尾<br />
public void endElement(String uri, String localName, String qName) throws SAXException {<br />
idx -= INDENT;<br />
}<br />
<br />
// 处理文档的起始点<br />
public void startDocument() throws SAXException {<br />
idx += INDENT;<br />
System.out.println("PARSING begins...");<br />
System.out.println(getIndent() + "start document: ");<br />
}<br />
<br />
// 处理标记头<br />
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {<br />
idx += INDENT;<br />
System.out.println('\n' + getIndent() + "start element: " + qName);<br />
<br />
}<br />
<br />
private String getIndent() {<br />
StringBuffer sb = new StringBuffer();<br />
for (int i = 0; i &lt; idx; i++)<br />
sb.append(" ");<br />
return sb.toString();<br />
}<br />
<br />
}</pre>
<br />
<br />
总结，虽然解析xml数据很复杂，因为涉及了很多的递归算法，但是我们可以使用业界比较成熟的解析API来进行xml数据处理。我现在只是给出了一个非常
简单的例子，但是在真实系统中远比这个要复杂的多，大家以后在使用的使用会发现还是有很多的工作要做的。</div>
<img src ="http://www.blogjava.net/caizh2009/aggbug/315699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-03-17 17:37 <a href="http://www.blogjava.net/caizh2009/archive/2010/03/17/315699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用SAX解析XML</title><link>http://www.blogjava.net/caizh2009/archive/2010/03/17/315690.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Wed, 17 Mar 2010 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/03/17/315690.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/315690.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/03/17/315690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/315690.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/315690.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em;">一、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前言 </p>
<p style="text-indent: 2em;">用
Java解析XML文档，最常用的有两种方法：使用基于事件的XML简单API（Simple API for
XML）称为SAX和基于树和节点的文档对象模型（Document Object Module）称为DOM。Sun公司提供了Java API
for XML Parsing（JAXP）接口来使用SAX和DOM，通过JAXP，我们可以使用任何与JAXP兼容的XML解析器。</p>
<p style="text-indent: 2em;">JAXP接口包含了三个包：</p>
<p style="text-indent: 2em;">（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.w3c.dom&nbsp; W3C推荐的用于XML标准规划文档对象模型的接口。</p>
<p style="text-indent: 2em;">（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.xml.sax&nbsp;&nbsp; 用于对XML进行语法分析的事件驱动的XML简单API（SAX）</p>
<p style="text-indent: 2em;">（3）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; javax.xml.parsers解析器工厂工具，程序员获得并配置特殊的特殊语法分析器。</p>
<p style="text-indent: 2em;">二、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前提 </p>
<p style="text-indent: 2em;">DOM编程不要其它的依赖包，因为JDK里自带的JDK里含有的上面提到的org.w3c.dom、org.xml.sax 和javax.xml.parsers包就可以满意条件了。</p>
<p style="text-indent: 2em;">三、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用SAX解析XML文档 </p>
<p style="text-indent: 2em;">SAX是基于事件的简单API，同样的我们也是用一个最简单的例子来看看SAX是如何解析XML的</p>
<p style="text-indent: 2em;">先来看看我们要解析的XML代码吧</p>
<p style="text-indent: 2em;">&lt;?xml version="1.0" encoding="gb2312"?&gt; </p>
<p style="text-indent: 2em;">&lt;books&gt; </p>
<p style="text-indent: 2em;">&nbsp; &lt;book email="zhoujunhui"&gt; </p>
<p style="text-indent: 2em;">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name addr="address"&gt;rjzjh&lt;/name&gt; </p>
<p style="text-indent: 2em;">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;price&gt;jjjjjj&lt;/price&gt; </p>
<p style="text-indent: 2em;">&nbsp; &lt;/book&gt; </p>
<p style="text-indent: 2em;">&lt;/books&gt;</p>
<p style="text-indent: 2em;">简单的不能再简单了。但是该有的都有了，根元素、属性、子节点。好了，能反应问题就行了，下面来看看解析这个XML文件的Java代码吧！</p>
<p style="text-indent: 2em;">1 public class SaxParse {</p>
<p style="text-indent: 2em;">2&nbsp;&nbsp;&nbsp;&nbsp; public SaxParse(){</p>
<p style="text-indent: 2em;">3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXParserFactory saxfac=SAXParserFactory.newInstance();</p>
<p style="text-indent: 2em;">4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p style="text-indent: 2em;">5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXParser saxparser=saxfac.newSAXParser();</p>
<p style="text-indent: 2em;">6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream is=new FileInputStream("bin/library.xml");</p>
<p style="text-indent: 2em;">7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saxparser.parse(is,new MySAXHandler());</p>
<p style="text-indent: 2em;">8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ParserConfigurationException e) {</p>
<p style="text-indent: 2em;">9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p style="text-indent: 2em;">10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (SAXException e) {</p>
<p style="text-indent: 2em;">11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p style="text-indent: 2em;">12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (FileNotFoundException e) {</p>
<p style="text-indent: 2em;">13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p style="text-indent: 2em;">14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {</p>
<p style="text-indent: 2em;">15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p style="text-indent: 2em;">16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">17&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">18&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</p>
<p style="text-indent: 2em;">19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new SaxParse();</p>
<p style="text-indent: 2em;">20&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">21&nbsp; }</p>
<p style="text-indent: 2em;">这段代码比较短，因为SAX是事件驱动的，它的大部分实现在在另一个Java文件中，先别管另一个文件，我们来一个个地分析吧！</p>
<p style="text-indent: 2em;">（1）得到SAX解析器的工厂实例</p>
<p style="text-indent: 2em;">3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXParserFactory saxfac=SAXParserFactory.newInstance();</p>
<p style="text-indent: 2em;">这是一个javax.xml.parsers.SAXParserFactory类的实例</p>
<p style="text-indent: 2em;">（2）从SAX工厂实例中获得SAX解析器</p>
<p style="text-indent: 2em;">5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXParser saxparser=saxfac.newSAXParser();</p>
<p style="text-indent: 2em;">使用javax.xml.parsers.SAXParserFactory工厂的newSAXParser()方法</p>
<p style="text-indent: 2em;">（3）把要解析的XML文档转化为输入流，以便DOM解析器解析它</p>
<p style="text-indent: 2em;">6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream is=new FileInputStream("bin/library.xml");</p>
<p style="text-indent: 2em;">InputStream是一个接口。</p>
<p style="text-indent: 2em;">（4）解析XML文档</p>
<p style="text-indent: 2em;">7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saxparser.parse(is,new MySAXHandler());</p>
<p style="text-indent: 2em;">后面就不用看了，都是些没用的代码（相对而言），够简单的吧！</p>
<p style="text-indent: 2em;">注意了，我们新建了一个实例new MySAXHandler()这个实例里面又有什么东西呢？</p>
<p style="text-indent: 2em;">这个实例就是SAX的精华所在。我们使用SAX解析器时，必须实现内容处理器ContentHandler接口中的一些回调方法，然而我们不须要全部地实现这些方法，还好，我们有org.xml.sax.helpers.DefaultHandler类，看它的类申明：</p>
<p style="text-indent: 2em;">public class DefaultHandler</p>
<p style="text-indent: 2em;">implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler</p>
<p style="text-indent: 2em;">实现了这么多接口啊，其它的先不管了，至少它实现了ContentHandler这一接口。</p>
<p style="text-indent: 2em;">好了，看看这个类有些什么吧？下面是它的Java代码！</p>
<p style="text-indent: 2em;">public class MySAXHandler extends DefaultHandler {</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean hasAttribute=false;</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Attributes attributes=null;</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* （非 Javadoc）</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* @see org.xml.sax.helpers.DefaultHandler#startDocument()</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*/</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void startDocument() throws SAXException {</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("文档开始打印了");</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* （非 Javadoc）</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* @see org.xml.sax.helpers.DefaultHandler#endDocument()</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*/</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void endDocument() throws SAXException {</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("文档打印结束了");</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* （非 Javadoc）</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;* @see
org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String,
java.lang.String, java.lang.String, org.xml.sax.Attributes)</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*/</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void startElement(String uri, String localName, String qName,</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Attributes attributes) throws SAXException {</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(qName.equals("books")){</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(qName.equals("book")){</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(attributes.getQName(0)+attributes.getValue(0));</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(attributes.getLength()&gt;0){</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.attributes=attributes;</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.hasAttribute=true;</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* （非 Javadoc）</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*/</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void endElement(String uri, String localName, String qName)</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws SAXException {</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(hasAttribute&amp;&amp;(attributes!=null)){</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;attributes.getLength();i++){</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(attributes.getQName(0)+attributes.getValue(0));</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* （非 Javadoc）</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*/</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void characters(char[] ch, int start, int length)</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws SAXException {</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(new String(ch,start,length));</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">}</p>
<p style="text-indent: 2em;">不要看它一大堆，我一一分解给大家看。我们说SAX是基于事件的API，我们这个类实到了ContentHandler接口中的如下方法：</p>
<p style="text-indent: 2em;">（1）startDocument()&nbsp; 用于处理文档解析开始事件</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp; public void startDocument() throws SAXException {</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("文档开始打印了");</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}</p>
<p style="text-indent: 2em;">（2）endDocument()&nbsp; 用于处理文档解析结束事件</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void endDocument() throws SAXException {</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("文档打印结束了");</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}</p>
<p style="text-indent: 2em;">（3）startElement&nbsp; 用于处理元素开始事件</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp; public void startElement(String uri, String localName, String qName,</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Attributes attributes) throws SAXException {</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(qName.equals("books")){</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(qName.equals("book")){</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(attributes.getQName(0)+attributes.getValue(0));</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(attributes.getLength()&gt;0){</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.attributes=attributes;</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.hasAttribute=true;</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p style="text-indent: 2em;">第二个参数String qName表示这个元素的名字，如：</p>
<p style="text-indent: 2em;">根节点 &lt;books&gt;&lt;/books&gt; 它的qName为&#8220;books&#8221;</p>
<p style="text-indent: 2em;">最底层节点 &lt;price&gt;jjjjjj&lt;/price&gt; 它的qName为&#8220;price&#8221;</p>
<p style="text-indent: 2em;">知道这一点上面程序就好解释了，当遇到根元素&#8220;books&#8221;时就什么也不做跳过，当遇到&#8220;book&#8221;元素时就打出它的属性（它只有一个属性&lt;book email="zhoujunhui"&gt;&lt;/book&gt;）。</p>
<p style="text-indent: 2em;">当是其它节点时（这下只剩下最底层的两个节点&#8220;name&#8221;和&#8220;price&#8221;了），就把它的属性取出来存到this.attributes域中，以后中元素结束事件好处理。</p>
<p style="text-indent: 2em;">（4）endElement 用于处理元素结束事件</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp; public void endElement(String uri, String localName, String qName)</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws SAXException {</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(hasAttribute&amp;&amp;(attributes!=null)){</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;attributes.getLength();i++){</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(attributes.getQName(0)+attributes.getValue(0));</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">代码的作用是如果这个元素的属性不为空（hasAttribute&amp;&amp;(attributes!=null)），就把它们打印出来。</p>
<p style="text-indent: 2em;">（5）characters(char[] ch, int start, int length) 处理元素字符的内容</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void characters(char[] ch, int start, int length)</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws SAXException {</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(new String(ch,start,length));</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em;">我们只用了这么几个事件，其它还有其的的一些事件，我们只要看一下ContentHandler这个接口就行了，如：</p>
<p style="text-indent: 2em;">（6）startPrefixMapping(String prefix,String URI) 处理前缀映射开始事件，参数表示前缀名称和所指向的URI</p>
<p style="text-indent: 2em;">（7）endPrefixMapping(String prefix,String URI) 处理前缀映射结束事件，参数表示前缀名称和所指向的URI</p>
<p style="text-indent: 2em;">（8）ignorableWhitespace(Char[] ch,int start,int length) 处理元素中可忽略的空格</p>
<p style="text-indent: 2em;">（9）processingInstruction(String target,String da<wbr>ta) 处理解析中产生的处理指令事件。</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/315690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-03-17 16:20 <a href="http://www.blogjava.net/caizh2009/archive/2010/03/17/315690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML的接口标准DOM与SAX的区别</title><link>http://www.blogjava.net/caizh2009/archive/2010/03/17/315682.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Wed, 17 Mar 2010 07:42:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/03/17/315682.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/315682.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/03/17/315682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/315682.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/315682.html</trackback:ping><description><![CDATA[当你需要处理XML文档时，你的首要选择是使用DOM(文档对象模型)还是使用SAX(用于XML的简单API)，即当前使用的两个主要的XML
API。你可以使用任何一种(或者在同一时间使用两种)来处理XML文档，然而DOM将文档载入到内存中处理，而SAX则相反，它可以检测一个即将到来的
XML流，由此并不需要所有的XML代码同时载入到内存中。<br />
选择DOM与SAX，与在一个数据库中的表单与视图之前选择一样：选择适合于当前实际情况的方法。如果你只是想简单地查看XML文档而不处理它，那么请选择使用SAX。
<p><br />
SAX与DOM之间有一些显著区别，包括：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM是复杂对象处理的首选，比如当XML比较复杂的时候，或者当你需要随机处理文档中数据的时候。SAX从文档的开始通过每一节点移动，以定位一个特定的节点。 <br />
DOM
为载入到内存的文档节点建立类型描述。最终，这些描述呈现了可容易横向移动、潜在巨大、树型结构。如果XML很冗长，DOM就会显示出无法控制的胀大。例
如，一个300KB的XML文档可以导致RAM或者虚拟内存中的3，000，000KB的DOM树型结构。通过比较就会发现，一个SAX文档根本就没有被
解构，它也没有隐藏在内存空间中(当然当XML流被读入时，会有部分文档暂时隐藏在内存中)。SAX就是一种&#8220;更轻巧的&#8221;技术──它可以给你的系统带来更
轻的负担。SAX相当于观看一场马拉松比赛，而DOM就好比邀请所有的比赛选手到家里参加晚餐。<br />
所以，你如何选择SAX和DOM？如果你处理复杂的东西，比如高级XSLT转换，或者Xpath过滤，请选择使用DOM。如果你建立或者更改XML文档，你也可以选择DOM。<br />
相反，你可以使用SAX来查询或者阅读XML文档。SAX可以快速扫描一个大型的XML文档，当它找到查询标准时就会立即停止，然后再处理之。<br />
在某些情况下，在一个方案中，最佳的选择是使用DOM和SAX处理不同的部分。例如，你可以使用DOM将XML载入到内存并改变它，然后通过从DOM树中发送一个SAX流而转移最后的结果。</p>
<p><br />
SAX概念</p>
<p>&nbsp;&nbsp;&nbsp;SAX是Simple API for XML的缩写，它并不是由W3C官方所提出的标准，可以说是&#8220;民间&#8221;的事实标准。实际上，它是一种社区性质的讨论产物。虽然如此，在XML中对SAX的应用丝毫不比DOM少，几乎所有的XML解析器都会支持它。</p>
<p>与DOM比较而言，SAX是一种轻量型的方法。我们知道，在处理DOM的时候，我们需要读入整个的XML文档，然后在内存中创建DOM树，生成
DOM树上的每个Node对象。当文档比较小的时候，这不会造成什么问题，但是一旦文档大起来，处理DOM就会变得相当费时费力。特别是其对于内存的需
求，也将是成倍的增长，以至于在某些应用中使用DOM是一件很不划算的事（比如在applet中）。这时候，一个较好的替代解决方法就是SAX。</p>
<p>&nbsp;&nbsp;&nbsp;SAX在概念上与DOM完全不同。首先，不同于DOM的文档驱动，它是事件驱动的，也就是说，它并不需要读入整个文档，而文档的读入过程也就
是SAX的解析过程。所谓事件驱动，是指一种基于回调（callback）机制的程序运行方法。（如果你对Java新的代理事件模型比较清楚的话，就会很
容易理解这种机制了）</p>
<p>&nbsp;&nbsp;&nbsp;在XMLReader接受XML文档，在读入XML文档的过程中就进行解析，也就是说读入文档的过程和解析的过程是同时进行的，这和DOM区
别很大。解析开始之前，需要向XMLReader注册一个ContentHandler，也就是相当于一个事件监听器，在ContentHandler中
定义了很多方法，比如startDocument()，它定制了当在解析过程中，遇到文档开始时应该处理的事情。当XMLReader读到合适的内容，就
会抛出相应的事件，并把这个事件的处理权代理给ContentHandler，调用其相应的方法进行响应</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/315682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-03-17 15:42 <a href="http://www.blogjava.net/caizh2009/archive/2010/03/17/315682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>