上篇對採用jaxp解析器使用dom技術解析xml做了一個介紹,對jaxp解析器使用sax技術解析xml則一筆帶過了,接下來我們看看jaxp採用sax技術是如何解析xml的呢。
採用sax技術解析xml是依靠於事件驅動的,邊讀邊解析,相關類位於javax.xml.parsers包裏面
**SAXParser 此類的實例可以從SAXParserFactory的newSAXParser( )方法獲得
|_ Parser( File f , DefaultHandler dh ) 兩個參數 *第一個參數:xml的路徑 *第二個參數:事件處理器
**SAXParserFactory 其實例可以通過本身的newInstance()方法得到
**SAX執行過程
|- 當解析到開始標籤的時,自動執行startElement()方法
|- 當解析到文本的時,自動執行characters()方法
|_ 當解析到結束標籤時,自動執行endElement()方法
**使用jaxp的sax方式來解析xml
*sax方式不能實現增刪改操作,只能做查詢操作
*打印整個xml文檔
執行parse()方法,第一個參數是xml路徑,第二個參數是事件處理器
**創建一個類,繼承事件處理器的類
**重寫裏面的三個方法
public class TestSax { public static void main(String[] args) throws Exception { /* * 1、創建解析器工廠 * 2、根據工廠得到解析器 * 3、調用解析器的parse方法 * 4、創建繼承事件處理器的類 */ //1、創建解析器工廠 SAXParserFactory saxParserFactory=SAXParserFactory.newInstance(); //2、根據工廠得到解析器 SAXParser saxParser=saxParserFactory.newSAXParser(); //3、調用解析器的parse方法 saxParser.parse("src/persion.xml", new MyHandler()); } } class MyHandler extends DefaultHandler{ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.print("<"+qName+">"); } @Override public void characters(char[] ch, int start, int length) throws SAXException { System.out.print(new String(ch,start,length)); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.print("</"+qName+">"); } }
*獲取到所有name的值
**定義一個成員變量flag=false
**判斷開始方法是否是name元素,如果是name元素,把flag設置爲true
**如果flag值爲true,在character()方法裏面打印內容
**當執行到結束方法時,把flag值設置成false
public class TestSax { public static void main(String[] args) throws Exception { /* * 1、創建解析器工廠 * 2、根據工廠得到解析器 * 3、調用解析器的parse方法 * 4、創建繼承事件處理器的類 */ //1、創建解析器工廠 SAXParserFactory saxParserFactory=SAXParserFactory.newInstance(); //2、根據工廠得到解析器 SAXParser saxParser=saxParserFactory.newSAXParser(); //3、調用解析器的parse方法 saxParser.parse("src/persion.xml", new MyHandler1()); } } class MyHandler1 extends DefaultHandler{ boolean flag=false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if("name".equals(qName)){ flag=true; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(flag==true){ System.out.println(new String(ch,start,length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("name".equals(qName)){ flag=false; } } }
*獲取到第一個name的值
public class TestSax { public static void main(String[] args) throws Exception { /* * 1、創建解析器工廠 * 2、根據工廠得到解析器 * 3、調用解析器的parse方法 * 4、創建繼承事件處理器的類 */ //1、創建解析器工廠 SAXParserFactory saxParserFactory=SAXParserFactory.newInstance(); //2、根據工廠得到解析器 SAXParser saxParser=saxParserFactory.newSAXParser(); //3、調用解析器的parse方法 saxParser.parse("src/persion.xml", new MyHandler1()); } } class MyHandler1 extends DefaultHandler{ boolean flag=false; int idx=1; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if("name".equals(qName)&&idx==1){ flag=true; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(flag==true){ System.out.println(new String(ch,start,length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("name".equals(qName)){ flag=false; idx++; } } }