JAVA 的XML編程SAX解析

來源:互聯網
上載者:User

SAX主要是以串列和層次的方式進行解析,如下是一個很簡單的解析例子:
1、選擇一個要解析的xml文檔
<?xml version="1.0"?><br /><!DOCTYPE book SYSTEM "DTD/JavaXML.dtd"><br /><!-- Java and XML Contents --><br /><book xmlns="http://www.oreilly.com/javaxml2" xmlns:ora="http://www.oreilly.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.oreilly.com/javaxml2 XSD/contents.xsd<br /> http://www.oreilly.com XSD/contents-ora.xsd"><br /> <title ora:series="Java">Java and XML</title><br /> <!-- Chapter List --><br /> <contents><br /> <chapter title="Introduction" number="1"><br /> <topic name="XML Matters"/><br /> <topic name="What's Important"/><br /> <topic name="The Essentials"/><br /> <topic name="What's Next?"/><br /> </chapter><br /> <chapter title="Nuts and Bolts" number="2"><br /> <topic name="The Basics"/><br /> <topic name="Constraints"/><br /> <topic name="Transformations"/><br /> <topic name="And More..."/><br /> <topic name="What's Next?"/><br /> </chapter><br /> <chapter title="SAX" number="3"><br /> <topic name="Getting Prepared"/><br /> <topic name="SAX Readers"/><br /> <topic name="Content Handlers"/><br /> <topic name="Gotcha!"/><br /> <topic name="What's Next?"/><br /> </chapter><br /> </contents><br /></book><br />

2、使用SAX進行解析,代碼如下:

package javaxml2;</p><p>import java.io.IOException;<br />import java.io.OutputStreamWriter;</p><p>import org.xml.sax.Attributes;<br />import org.xml.sax.ContentHandler;<br />import org.xml.sax.InputSource;<br />import org.xml.sax.Locator;<br />import org.xml.sax.SAXException;<br />import org.xml.sax.XMLReader;<br />import org.xml.sax.helpers.DefaultHandler;<br />import org.xml.sax.helpers.XMLReaderFactory;</p><p>public class MySaxXml extends DefaultHandler{</p><p> /**<br /> * @param args<br /> * @throws SAXException<br /> * @throws Exception<br /> */<br /> private Locator locator;<br /> private int index1=0;<br /> private int index2=0;</p><p> public void characters(char[] ch, int start, int length) throws SAXException {<br /> // TODO 自動產生方法存根<br /> //System.out.print( "SAX Event: CHARACTERS[ " ); </p><p> System.out.print("本書<<");<br /> try {<br /> OutputStreamWriter outw = new OutputStreamWriter(System.out);<br /> outw.write( ch, start,length );<br /> outw.flush();<br /> } catch (Exception e) {<br /> e.printStackTrace();<br /> } </p><p> System.out.println(">>的目錄");<br /> //System.out.println( " ]" );<br /> }</p><p> public void endDocument() throws SAXException {<br /> // TODO 自動產生方法存根<br /> System.out.println( "解析結束:" );<br /> }</p><p> public void endElement(String uri, String localName, String qName) throws SAXException {<br /> // TODO 自動產生方法存根<br /> //System.out.println( "SAX Event: END ELEMENT[ " + localName + " ]" );<br /> //this.index2=0;<br /> if(qName.equalsIgnoreCase("chapter"))<br /> this.index2=0;<br /> }<br /> public void setDocumentLocator(Locator locator) {<br /> // TODO 自動產生方法存根<br /> this.locator=locator;<br /> }<br /> public void startDocument() throws SAXException {<br /> // TODO 自動產生方法存根<br /> System.out.println( "解析開始: " );<br /> }<br /> public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {<br /> // TODO 自動產生方法存根</p><p> //System.out.println( "SAX Event: START ELEMENT[ " + localName + " ]" );<br /> if(qName.equalsIgnoreCase("chapter")){<br /> index1++;<br /> for ( int i = 0; i < atts.getLength(); i++ ){<br /> //System.out.println(atts.getLength());<br /> String attName=atts.getQName(i);<br /> if(attName.equalsIgnoreCase("title")){<br /> System.out.println("第"+index1+"章:"+atts.getValue(i));<br /> }<br /> }<br /> }</p><p> if(qName.equalsIgnoreCase("topic")){<br /> index2++;<br /> for ( int i = 0; i < atts.getLength(); i++ ){<br /> String attName=atts.getQName(i);<br /> if(attName.equalsIgnoreCase("name")){<br /> System.out.println(" 第"+index2+"部分:"+atts.getValue(i));<br /> }<br /> }<br /> }<br /> }<br /> public static void main(String[] args) throws Exception {<br /> // TODO 自動產生方法存根</p><p> String vendorParserClass= "org.apache.xerces.parsers.SAXParser";<br /> String xmlURI="http://localhost:8080/TestXml/contents.xml";<br /> XMLReader reader =<br /> XMLReaderFactory.createXMLReader(vendorParserClass);<br /> reader.setContentHandler(new MySaxXml());<br /> InputSource inputSource=new InputSource(xmlURI);<br /> reader.parse(inputSource);<br /> }<br />}

3、其中contentHandler只實現了它的幾個方法,解析結果如下:

解析開始:<br />本書<<Java and XML>>的目錄<br />第1章:Introduction<br /> 第1部分:XML Matters<br /> 第2部分:What's Important<br /> 第3部分:The Essentials<br /> 第4部分:What's Next?<br />第2章:Nuts and Bolts<br /> 第1部分:The Basics<br /> 第2部分:Constraints<br /> 第3部分:Transformations<br /> 第4部分:And More...<br /> 第5部分:What's Next?<br />第3章:SAX<br /> 第1部分:Getting Prepared<br /> 第2部分:SAX Readers<br /> 第3部分:Content Handlers<br /> 第4部分:Gotcha!<br /> 第5部分:What's Next?<br />解析結束<br />

讀後感:我剛學解析的時候就是用這個例子,其實SAX解析就是那麼簡單,自己實現SAX解析也不難,xml這麼有規則,現在java各種架構技術為瞭解耦,都離不開xml也就離不開解析。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.