使用SAX方式解析XML文件

SAX方式解析XML的步驟:

1、通過SAXParseFactory的靜態newInstance()方法獲取SAXParseFactory實例factory

2、SAXParseFactory實例的newSAXParse()方法返回SAXParser實例parser

3、創建一個類繼承DefaultHandle,重寫方法進行業務已處理,創建這個類的實例handle


新建一個XML文件demo.xml,代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <book id="1">
     <name>放學後</name>
     <author>lcb</author>
     <year>2010</year>
     <price>25</price>
  </book>

  <book id="2">
     <name>你的孤獨,雖敗猶榮</name>
     <author>劉同</author>
     <year>2011</year>
     <price>30</price>
  </book>
</bookstore>

新建SAXHandler.java類並繼承DefaultHandle,並重寫startElement()、endElement()、startDocument()、endDocument()方法

package com.imooc.io;


import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXHandler extends DefaultHandler {
     /**
      * 解析XML的開始標籤
      */
	public void startElement(String uri, String localName, 
			String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		super.startElement(uri, localName, qName, attributes);
		//開始解析book元素
		if(qName.equals("book")){
			//已知book元素屬性的名稱,根據屬性名獲取屬性值
			//String value = attributes.getValue("id");
			//System.out.println("book的屬性值是:"+value);
			//獲取book元素屬性的長度
			int num = attributes.getLength();
			for(int i = 0; i<num; i++){
				System.out.println("book元素第"+(i+1)+"個屬性名是:"+attributes.getQName(i));
				System.out.println("book元素第"+(i+1)+"個屬性值是:"+attributes.getValue(i));
			}
		}
		//如果不是book標籤和bookstore標籤,進行輸出節點名
		else if(!qName.equals("book") && !qName.equals("bookstore")){
			System.out.println("節點名是:"+qName);
		}
	}
	
	/**
	 * 用於獲取節點名對應的節點值
	 */
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		super.characters(ch, start, length);
		//使用String(byte[] bytes,int offset,int length)構造方法把字符數組傳遞進去
		String value = new String(ch, start, length);
		/**
		 * 因爲characters解析時會把多餘空格一起解析,造成輸出多餘空格,
		 * 用trim方法去除空格後,並且不等於空格後才進行輸出
		 */
		if(!value.trim().equals("")){
			System.out.println(value);
		}
		
	}
	
	/**
	 * 解析XML的結束標籤
	 */
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);
		
	}
	
	/**
	 * 用來標識解析xml文檔的開始
	 */
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.startDocument();
		System.out.println("SAX開始解析XML");
	}
	
	/**
	 * 用來標識解析xml文檔的結束
	 */
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();
		System.out.println("SAX解析XML完成");
	}
}



在新建SAXTest.java,進行測試:

package com.imooc.io;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class SAXtest {
	public static void main(String[] args){
		//通過SAXParseFactory的靜態newInstance()方法獲取SAXParseFactory實例factory
		SAXParserFactory factory = SAXParserFactory.newInstance();
		try {
			//SAXParseFactory實例的newSAXParse()方法返回SAXParser實例parser
			SAXParser parser = factory.newSAXParser();
			//創建SAXHandler的對象
			SAXHandler handler = new SAXHandler();
			parser.parse("demo.xml", handler);
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

運行結果爲:

SAX開始解析XML
book元素第1個屬性名是:id
book元素第1個屬性值是:1
節點名是:name
放學後
節點名是:author
lcb
節點名是:year
2010
節點名是:price
25
book元素第1個屬性名是:id
book元素第1個屬性值是:2
節點名是:name
你的孤獨,雖敗猶榮
節點名是:author
劉同
節點名是:year
2011
節點名是:price
30
SAX解析XML完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章