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文檔進行解析