Java SAX 解析器 - 查詢 XML 文件



Java SAX 解析器是 Java 中的一個 API,可用於查詢 XML 文件。要使用基於事件的 API 查詢大型 XML 文件,可以使用 Java SAX 解析器 API。SAXParser API 位於 javax.xml.parsers 包中。可以透過繼承 DefaultHandler 類(它又繼承 ContentHandler 介面)並在 Handler 類中實現回撥方法來查詢任何 XML 文件。

使用 Java SAX 解析器查詢 XML

可以使用以下步驟透過 Java SAX 解析器查詢任何 XML 文件:

  • 步驟 1:實現 Handler 類
  • 步驟 2:建立 SAXParser 物件
  • 步驟 3:讀取 XML
  • 步驟 4:建立 Handler 類物件
  • 步驟 5:解析 XML 文件
  • 步驟 6:查詢元素

關於前五個步驟,請參考 本章節

步驟 6:查詢元素

ContenHnadler 和 Attributes 介面提供多種方法,可幫助我們查詢元素及其屬性。為了查詢所需資訊,我們在 Handler 類中實現程式碼。

按文字內容查詢元素

characters() 方法用於獲取元素的內容。endDocument() 函式在文件末尾呼叫。我們可以使用此方法執行在關閉 XML 檔案之前需要執行的一些必要操作。

示例

我們需要查詢以下 cars.xml 檔案,以確定文件中是否存在“Bentley 2”汽車。

<?xml version = "1.0"?>
<cars>
      <carname company="Ferrari" >Ferrari 101</carname>
      <carname company="Lamborghini">Lamborghini 001</carname>
      <carname company="Lamborghini">Lamborghini 002</carname>
      <carname company="Lamborghini">Lamborghini 003</carname>
      <carname company="Bentley">Bentley 1</carname>
      <carname company="Bentley">Bentley 2</carname>
      <carname company="Bentley">Bentley 3</carname>
</cars>    

在下面的 Java 程式中,我們在 UserHandler 類中實現了 characters() 和 endDocument() 方法。我們在 characters() 函式中編寫了查詢 Bentley 汽車的程式碼,並使用 endDocument() 方法列印最終結果。

import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

//Implementing UserHandler Class
class UserHandler extends DefaultHandler {
	
   boolean found = false;
	
   public void characters(char[] ch, int start, int length) throws SAXException{
	   String textContent = new String(ch,start,length);
	  if(textContent.equals("Bentley 2")) {
		  found=true;
	  }
   }
   public void endDocument() {
	   if(found)
	   System.out.println("Bentley 2 car is found");
	   else
	   System.out.println("Bentley 2 car is not Found");	  
   }
}

public class QueryXMLElements {
   public static void main(String args[]) {
      try {
	                  			
         //Creating a DocumentBuilder Object             	  
		 SAXParserFactory factory = SAXParserFactory.newInstance();
		 SAXParser saxParser = factory.newSAXParser();
		       
		 //Reading the XML
		 File xmlFile = new File("cars.xml");
		     
		 //Creating UserHandler object
		 UserHandler userHandler = new UserHandler();
		     
		 //Parsing the XML Document
		 saxParser.parse(xmlFile, userHandler);
		     
      } catch(Exception e) {
    	  e.printStackTrace();
	  }
   }
}

輸出顯示已找到 Bentley 汽車。

Bentley 2 car is found

按屬性查詢元素

可以使用 Attributes 介面按屬性查詢元素。我們從 startElement() 函式的最後一個引數中獲取元素屬性列表。如前一章所述,getValue("attr_name") 函式用於獲取屬性值。

示例

讓我們使用我們在前面示例中使用的 cars.xml 檔案來計算 Bentley 汽車的數量。此資訊只能透過屬性值獲得。當解析器遇到元素時,我們使用 getValue("company") 獲取公司屬性,如果該公司是 Bentley,則遞增計數。

import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

//Implementing UserHandler Class
class UserHandler extends DefaultHandler {
	
   int count=0;
   
   public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
	   String company = attributes.getValue("company");
	   if(qName.equals("carname") && company.equals("Bentley")) {
    	  count++;
      }  
   }
   public void endDocument() {
      System.out.println("No. of Bentley cars found : " + count);
   }
}

public class QueryXMLAttributes {
   public static void main(String args[]) {
      try {
	                  			
         //Creating a DocumentBuilder Object             	  
		 SAXParserFactory factory = SAXParserFactory.newInstance();
		 SAXParser saxParser = factory.newSAXParser();
		       
		 //Reading the XML
		 File xmlFile = new File("cars.xml");
		     
		 //Creating UserHandler object
		 UserHandler userHandler = new UserHandler();
		     
		 //Parsing the XML Document
		 saxParser.parse(xmlFile, userHandler);
		     
      } catch(Exception e) {
    	  e.printStackTrace();
	  }
   }
}

呼叫 endDocument() 方法時顯示輸出。

No.of Bentley cars found : 3
廣告