Java對XML文檔進行解析(SAX、StAX解析)

SAX解析器方式入口:javax.xml.parsers包中的SAXParser解析器(通過getXMLReader獲得文檔閱讀器)XMLReader

下面解析users.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<users>
	<user id="A1001" aa="aaa">
		<name>dragon</name>
		<age>21</age>
	</user>

	<user id="A1002">
		<name>Rose</name>
		<age>19</age>
	</user>
</users>
1.

@Test
	public void demo1() throws ParserConfigurationException, SAXException, FileNotFoundException, IOException{
		//1.獲得XML文檔閱讀器
		SAXParser sax=SAXParserFactory.newInstance().newSAXParser();
		XMLReader reader=sax.getXMLReader();
		//2.設置閱讀方式
		reader.setContentHandler(new DefaultHandler(){

			@Override
			public void startDocument() throws SAXException {
				System.out.println("1.開始閱讀文檔!");
			}

			@Override
			public void endDocument() throws SAXException {
				System.out.println("4.文檔閱讀完畢");
			}
			/**
			 * uri - 名稱空間 URI
			 * localName - 本地名稱(不帶前綴),
			 * qName - 限定名(帶有前綴)
			 * atts - 連接到元素上的屬性
			 */
			@Override
			public void startElement(String uri, String localName,
					String qName, Attributes attributes) throws SAXException {
				String str="";
				for(int i=0;i<attributes.getLength();i++){
					str+=attributes.getQName(i)+"="+attributes.getValue(i)+",";	//獲取所有的屬性
				}
				System.out.println("2.一個元素開始:"+qName+","+str);
			}

			@Override
			public void endElement(String uri, String localName, String qName)
					throws SAXException {
				System.out.println("3.一個元素結束:"+qName);
			}
			/**
			 * ch - 來自 XML 文檔的字符
			 * start - 數組中的開始位置
			 * length - 從數組中讀取的字符的個數 
			 */
			@Override
			public void characters(char[] ch, int start, int length)
					throws SAXException {
				String str = new String(ch, start, length);
				if(str.trim().length()!=0){
					System.out.println("文本內容"+str);
				}
			}
			
		});
		
		//3.閱讀動作的觸發
		reader.parse("./xml/users.xml");
	}
結果:

1.開始閱讀文檔!
2.一個元素開始:users,
2.一個元素開始:user,id=A1001,aa=aaa,
2.一個元素開始:name,
文本內容dragon
3.一個元素結束:name
2.一個元素開始:age,
文本內容21
3.一個元素結束:age
3.一個元素結束:user
2.一個元素開始:user,id=A1002,
2.一個元素開始:name,
文本內容Rose
3.一個元素結束:name
2.一個元素開始:age,
文本內容19
3.一個元素結束:age
3.一個元素結束:user
3.一個元素結束:users
4.文檔閱讀完畢
2.

/**
	 * 把users.xml中的信息讀取出來,按如下格式輸出
	 * 	id:A1001
	 * 	name:dragon
	 * 	age:21
	 * -------------
	 * 	id:A1002
	 *  name:Rose
	 *  age:19
	 */
	@Test
	public void demo2() throws ParserConfigurationException, Exception{
		//獲取XMLReader文檔閱讀器
		SAXParser sax = SAXParserFactory.newInstance().newSAXParser();
		XMLReader reader=sax.getXMLReader();
		
		//設置閱讀器
		reader.setContentHandler(new DefaultHandler(){
			private String elementName="";
			@Override
			public void startElement(String uri, String localName,
					String qName, Attributes attributes) throws SAXException {
				if(qName.equals("user")){
					String id=attributes.getValue("id");
					System.out.println("id:"+id);
				}else if(qName.equals("name") || qName.equals("age")){
					elementName=qName;
				}
				
			}

			@Override
			public void endElement(String uri, String localName, String qName)
					throws SAXException {
				elementName="";
				if(qName.equals("user")){
					System.out.println("----------");
				}
			}

			@Override
			public void characters(char[] ch, int start, int length)
					throws SAXException {
				if(!elementName.equals("")){
					System.out.println(elementName+":"+new String(ch, start, length));
				}
			}
			
		});
		
		
		//閱讀動作的觸發
		reader.parse("./xml/users.xml");
		
	}
結果:

id:A1001
name:dragon
age:21
----------
id:A1002
name:Rose
age:19
----------

StAX解析技術的入口:XMLEventReader (extends Iterator)

下面通過StAX對users.xml進行解析

package cn.hncu.stax;

import java.io.FileReader;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

/*
 * Sax的技術入口:XMLReader,通過SAXParser解析器獲取
 * StAX技術的入口:XMLEventReader	(extends Iterator)
 */
public class StaxDemo {
	public static void main(String[] args) throws Exception,ClassCastException {
		//1.通過XMLInputFactory
		XMLInputFactory factory=XMLInputFactory.newFactory();
		//createXMLEventReader(Reader reader) 根據 reader 創建一個新 XMLEventReader。
		XMLEventReader reader=factory.createXMLEventReader(new FileReader("./xml/users.xml"));
		
		//reader是一個迭代器,內部遍歷出的每個元素是一個XMLEventReader對象
		
		//2.遍歷XML事件
		while(reader.hasNext()){
			XMLEvent event = reader.nextEvent();
			if( event.isStartElement() ){
				StartElement startElement = event.asStartElement();
				//startElement.getName()返回的是一個qName對象
				if(startElement.getName().getLocalPart().equals("user")){
					String id=startElement.getAttributeByName(new QName("id")).getValue();
					System.out.println("id:"+id);
				}else if(startElement.getName().getLocalPart().equals("name")){
					//獲取文本內容   當前元素開始事件的下一個對象
					Characters chs = reader.nextEvent().asCharacters();
					System.out.println("name:"+chs.getData());
				}else if(startElement.getName().getLocalPart().equals("age")){
					//獲取文本內容   當前元素開始事件的下一個對象
					Characters chs = reader.nextEvent().asCharacters();
					System.out.println("age:"+chs.getData());
				}
			}else if(event.isEndElement()){
				if(event.asEndElement().getName().getLocalPart().equals("user")){
					System.out.println("---------");
				}
			}
		}
		
	}
}
結果:

id:A1001
name:dragon
age:21
---------
id:A1002
name:Rose
age:19
---------
由以上對比可知,使用StAX對xml文檔進行解析,更爲靈活,所以建議採用StAX對xml文檔進行解析
發佈了102 篇原創文章 · 獲贊 89 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章