XML 三、 應用 SAX 方式解析 XML

3-1 使用 SAX 解析 XML 文件的開始和結束

1.通過SAXParserFactory的靜態newInstance()方法獲取一個SAXParserFactory的對象。

SAXParserFactory factory = SAXParserFactory.newInstance();

2.通過SAXParserFactory對象的newSAXParser()方法返回一個SAXParser類的對象。

SAXParser parser = factory.newSAXParser();

3.創建一個類繼承DefaultHandler,重寫startElement()和endElement()方法,startDocument()方法和endDocument()方法並創建類的實例.

4.通過SAXParser類的Parse(Stringname,df)方法解析xml文件,參數Stringname爲路徑名,df爲繼承於DefaultHandler類的實例化對象,不需要定義變量存儲返回的類型.

parser.parse("book.xml",handler);

  • SAX是按節點順序進行解析,遇到xml的聲明即開始解析,遇到最後一個節點的尾節點便結束解析,需要用戶自己定義一個類繼承於DefaultHandler類來解析,遇到開始標籤節點便通過startElement開始解析節點,遇到結束標籤節點便通過endElement結束解析,再遇到開始節點繼續通過startElement解析,一直循環直到xml文件最後的結束標籤節點.

5.在繼承於DefaultHandler這個類中需要重寫父類的startElement()和endElement()方法,來進行開始節點與結束節點的解析,再重寫startDocument()方法與endDocument()方法來標識解析的開始與結束.

 

3-2  使用 SAX 解析 XML 文件的節點屬性

重寫startElement()方法

1. 調用DefaultHanlder 的startElement()方法 super.startElement(uri,localName,qName,attributes);

2.開始解析book元素屬性

if(qname.equals("book")){

//已知節點的屬性名時

String value = attributes.getValue("id");

System.out.print("屬性值:"+value);

//未知節點的屬性名時,獲取屬性名和屬性值

for(int i=0;i<attributes.getLength();i++){

System.out.print(attributes.getQname(i)+attributes.getValue(i));

}

}

 

3-3  使用 SAX 解析 XML 文件的節點名和節點間文本

SAX解析XML的速度比DOM的塊, SAX的解析XML的解析器,需要重寫startElement()開始解析的方法and endElemaent()方法 結束解析的方法and characters()方法

重寫charaters()方法時,String(byte[] bytes,int offset,int length)的構造方法進行數組的傳遞 再去除解析時多餘空格

if(!value.trim().equals("")){

System.out.println(value);

}

 

使用 SAX 解析 XML 文件的節點名和節點間文本

startElement方法——String qName(第三個參數):節點名

startElement方法——Attributes attributes(第四個參數):節點名的屬性操作

characters方法——char[] ch(第一個參數):xml整個文本內容,所以需截取想要的內容

/**

  * 獲取節點值

  */

 @Override

 public void characters(char[] ch, int start, int length) throws SAXException {

  super.characters(ch, start, length);

  String value = new String(ch, start, length);

  if(!value.trim().equals("")){

   System.out.println("節點值:"+value);

  }

 }

 

3-4 使用 SAX 解析將 XML 的內容和結構存入 JAVA 對象

先創建一個實體類對象book類,在book類裏封裝xml文件中book 的所有屬性,source set和get方法

在SAXParserHandler中創建全局變量value和book,並用ArrayList<book>來保存book對象

在endElement方法中

if (qName.equals("book")) {

bookList.add(book);

book = null;//【注意:每弄完一本書進行清空給下一本書用】

System.out.println("======================結束遍歷某一本書的內容=================");

}

else if (qName.equals("name")) {

book.setName(value);

} .

..//類似上面else if(){}

 

 

 

 

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