
- Java XML 教程
- Java XML 首頁
- Java XML 概述
- Java XML 解析器
- Java DOM 解析器
- Java DOM 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java SAX 解析器
- Java SAX 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- JDOM XML 解析器
- JDOM XML 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java StAX 解析器
- Java StAX 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java XPath 解析器
- Java XPath 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java DOM4J 解析器
- Java DOM4J 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java XML 有用資源
- Java XML - 問題與解答
- Java XML - 快速指南
- Java XML - 有用資源
- Java XML - 討論
Java SAX 解析器 - 解析 XML 文件
Java SAX(Simple API for XML) 解析器是 Java 中用於解析 XML 文件的 API。SAX 解析器是基於事件的解析器,並使用 Handler 類來處理事件。回撥方法(例如 startElement()、characters()、endElement() 等)在 Handler 類中實現,以獲取元素及其屬性的詳細資訊。當解析器識別到相應的事件時,會呼叫這些回撥方法。
使用 Java SAX 解析器解析 XML
以下是使用 SAX 解析器在 Java 中解析 XML 文件需要遵循的步驟:
- 步驟 1:實現 Handler 類
- 步驟 2:建立 SAXParser 物件
- 步驟 3:讀取 XML
- 步驟 4:為 Handler 類建立物件
- 步驟 5:解析 XML 文件
- 步驟 6:檢索元素
步驟 1:實現 Handler 類
應用程式必須實現一個 Handler 類來處理 XML 文件內的事件。實現 Handler 類後,必須將其註冊到 SAX 解析器。
如前一章所述,DefaultHandler 類實現了 ContentHandler 介面。它具有 startDocument()、endDocument()、startElement()、endElement() 和 characters() 等方法,這些方法有助於我們解析 XML 文件。我們根據需要在這些方法內部編寫程式碼。
class UserHandler extends DefaultHandler { public void startDocument() { ... } public void startElement(String uri, String localName, String qName, Attributes attributes) { ... } public void characters(char[] ch, int start, int length) { ... } public void endElement(String uri, String localName, String qName) { ... } public void endDocument() { ... } }
步驟 2:建立 SAXParser 物件
SAXParserFactory 類用於建立一個新的工廠例項,該例項又用於建立 SAXParser 物件,如下所示:
SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser();
步驟 3:讀取 XML
透過指定正確的檔案路徑來讀取 XML 檔案,如下所示:
File xmlFile = new File("input.xml");
除了讀取檔案,我們還可以建立 XML 內容的 InputStream,如下所示:
StringBuilder xmlBuilder = new StringBuilder(); xmlBuilder.append(""<?xml version="1.0"?> <rootElement></rootElement>""); ByteArrayInputStream inputStream = new ByteArrayInputStream( xmlBuilder.toString().getBytes("UTF-8"));
步驟 4:為 Handler 類建立物件
為第一步中已實現的 UserHandler 類建立一個物件,如下所示:
UserHandler userHandler = new UserHandler();
步驟 5:解析 XML 文件
SAXParser 類具有 parse() 方法,該方法接受兩個引數,一個是檔案,另一個是 DefaultHandler 物件。此函式使用 DefaultHandler 類中實現的函式將給定檔案解析為 XML 文件。
saxParser.parse(xmlFile, userHandler);
SAXParser 類還具有 parse() 函式,該函式將內容作為 InputStream 接收:
saxParser.parse(inputStream, userHandler);
步驟 6:檢索元素
在完成上述五個步驟後,我們現在可以輕鬆檢索有關元素的所需資訊。我們應該在第一步中 Handler 類的內部方法中編寫所需的程式碼。ContentHandler 介面中提供的所有方法都在前一章中進行了討論,在本節中,我們將實現這些方法以檢索有關元素的基本資訊,例如元素名稱、文字內容和屬性。
檢索元素名稱
元素名稱可以從 ContentHandler 介面的 startElement() 方法中獲取。此方法的第三個引數是元素的名稱,它是 String 型別。我們可以在我們的 Handler 類中實現此方法並獲取元素的名稱。
示例
在以下示例中,我們使用 StringBuilder 類以字串的形式獲取 XML 內容,並使用 ByteArrayInputStream 轉換為位元組。
在 UserHandler 類中,我們實現了 startElement() 方法並列印了元素的名稱。由於 XML 內容中只有一個元素,因此它成為文件的根元素。
import java.io.ByteArrayInputStream; 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{ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("Root element is "+qName); } } public class RetrieveElementName { public static void main(String args[]) { try { //Creating a SAXParser Object SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); //Reading the XML StringBuilder xmlBuilder = new StringBuilder(); xmlBuilder.append("<college>XYZ College</college>"); ByteArrayInputStream input = new ByteArrayInputStream(xmlBuilder.toString().getBytes("UTF-8")); //Creating UserHandler object UserHandler userhandler = new UserHandler(); //Parsing the XML Document saxParser.parse(input, userhandler); } catch (Exception e) { e.printStackTrace(); } } }
根元素名稱“college”列印在輸出螢幕上。
Root element is college
檢索文字內容
要檢索元素的文字內容,我們在 ContentHandler 介面中使用 characters() 方法。此方法中包含字元陣列、起始位置和長度引數。一旦解析器看到“>”符號後的內容,就會呼叫此方法。start 引數承載“>”符號後第一個字元的索引,length 包含在遇到“<”符號之前的字元數。
示例
以下 college.xml 檔案具有一個子元素“department”,其文字內容為“Computer Science”。讓我們編寫一個 Java 程式,使用 SAX API 檢索此文字內容以及元素名稱。
<college> <department>Computer Science</department> </college>
UserHandler 類繼承 DefaultHandler,並且我們實現了 startElement()、endElement() 和 characters() 方法。當解析器看到 department 元素內的文字內容時,會呼叫此方法,我們將其列印到控制檯上。
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 { public void startElement( String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("Start Element : " + qName); } public void endElement(String uri, String localName, String qName) { System.out.println("End Element : " + qName); } public void characters(char[] ch, int start, int length) throws SAXException{ System.out.println("Text Content : " + new String(ch, start, length)); } } public class RetrieveTextContent { public static void main(String args[]) { try { //Creating a SAXParser Object SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); //Reading the XML File xmlFile = new File("college.xml"); //Creating UserHandler object UserHandler userHandler = new UserHandler(); //Parsing the XML Document saxParser.parse(xmlFile, userHandler); } catch(Exception e) { e.printStackTrace(); } } }
顯示了 department 元素的文字內容。由於“college”元素內部沒有文字內容,因此它為空白。
Start Element : college Text Content : Start Element : department Text Content : Computer Science End Element : department Text Content : End Element : college
檢索屬性
startElement() 方法以 Attributes 作為最後一個引數,它包含當前元素內部的屬性列表。Attributes 介面內的 getValue("attr_name") 函式用於獲取指定屬性的值。
示例
我們在“college.xml”檔案中添加了一些 department 元素,並且還為每個 department 添加了一個屬性“deptcode”。讓我們編寫一個 Java 程式來檢索所有元素及其屬性。
<?xml version = "1.0"?> <college> <department deptcode = "DEP_CS23"> <name>Computer Science</name> <staffCount>20</staffCount> </department> <department deptcode = "DEP_EC34"> <name>Electrical and Electronics</name> <staffCount>23</staffCount> </department> <department deptcode = "DEP_MC89"> <name>Mechanical</name> <staffCount>15</staffCount> </department> </college>
以下 Java 程式在 UserHandler 類中實現了 startElement() 和 characters() 方法。我們初始化了兩個布林變數,以讓我們在 department 元素中瞭解 deptcode 和 staffCount 屬性,以便我們可以在 characters() 方法中使用它們來列印屬性。
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{ boolean hasDeptName=false; boolean hasStaffCount=false; public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{ if(qName.equals("college")) { System.out.println("Root Element : "+qName + "\n"); } if(qName.equals("department")) { System.out.println("Current Element : "+qName); System.out.println("Department code : "+ attributes.getValue("deptcode")); } if(qName.equals("name")) { hasDeptName=true; } if(qName.equals("staffCount")) { hasStaffCount=true; } } public void characters(char[] ch, int start, int length) throws SAXException{ if(hasDeptName) { System.out.println("Department Name : "+ new String(ch, start, length)); hasDeptName=false; } if(hasStaffCount) { System.out.println("Staff Count : "+ new String(ch, start, length) + "\n"); hasStaffCount=false; } } } public class ParseAttributesSAX { 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("college.xml"); //Creating UserHandler object UserHandler userHandler = new UserHandler(); //Parsing the XML Document saxParser.parse(xmlFile, userHandler); } catch(Exception e) { e.printStackTrace(); } } }
輸出視窗顯示每個元素的名稱以及屬性。
Root Element : college Current Element : department Department code : DEP_CS23 Department Name : Computer Science Staff Count : 20 Current Element : department Department code : DEP_EC34 Department Name : Electrical and Electronics Staff Count : 23 Current Element : department Department code : DEP_MC89 Department Name : Mechanical Staff Count : 15