文章目錄
- 1.SAX 解析器
- 1)什么是 SAX
- 2)SAX 工作流程
- 初始化
- 實現事件處理類
- 解析
- 3)示例代碼
- 2.DOM 解析器
- 1)什么是 DOM
- 2)DOM 工作流程
- 初始化
- 解析 XML 文檔
- 操作 DOM 樹
- 3)示例代碼
- 總結
在項目開發中,XML 是一種常見的數據交換格式。為了處理和解析 XML 文檔,Java 提供了兩種主要的解析方式:SAX(Simple API for XML)和 DOM(Document Object Model)。
1.SAX 解析器
1)什么是 SAX
SAX 是一種基于事件的 XML 解析方式。它逐行的掃描 XML 文檔,并在解析的過程中觸發事件,允許程序對文檔進行響應。由于 SAX 不需要將整個文檔加載到內存中,因此適用于處理大型 XML 文件。
2)SAX 工作流程
初始化
創建 SAXParserFactory
實例,并通過它創建 SAXParser
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
實現事件處理類
創建一個類,實現 org.xml.sax.helpers.DefaultHandler
類或其子類,重寫需要處理的事件方法
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;public class HandlerDemo extends DefaultHandler {@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {// 處理元素開始事件}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {// 處理元素文本事件}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {// 處理元素結束事件}
}
解析
使用 SAXParser
解析 XML 文檔,并將事件處理類注冊到解析器中
HandlerDemo handler = new HandlerDemo();
saxParser.parse("example.xml", handler);
3)示例代碼
example.xml
<?xml version="1.0" encoding="UTF-8"?>
<student><name>cheney</name><age>18</age>
</student>
Demo.java
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
public class Demo {public static void main(String[] args) throws Exception {// 1. 初始化SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser saxParser = factory.newSAXParser();// 2. 實現事件處理類DefaultHandler handler = new DefaultHandler() {@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) {System.out.println("元素開始: " + qName);}@Overridepublic void characters(char[] ch, int start, int length) {String str = new String(ch, start, length).trim();if (!"".equals(str)) {System.out.println("元素文本: " + str);}}@Overridepublic void endElement(String uri, String localName, String qName) {System.out.println("元素結束: " + qName);}};// 3. 解析String path = "D:\\workspace\\demo\\src\\main\\resources\\example.xml";saxParser.parse(new File(path), handler);}
}
輸出結果:
元素開始: student
元素開始: name
元素文本: cheney
元素結束: name
元素開始: age
元素文本: 18
元素結束: age
元素結束: student
2.DOM 解析器
1)什么是 DOM
DOM 是一種基于樹結構的 XML 解析方式。它將整個 XML 文檔加載到內存中,并形成一個樹形結構,允許通過節點的方式訪問和修改文檔的內容。DOM 解析器適用于需要頻繁隨機訪問 XML 數據的情況。
2)DOM 工作流程
初始化
創建 DocumentBuilderFactory
實例,并通過它創建 DocumentBuilder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
解析 XML 文檔
使用 DocumentBuilder
解析 XML 文檔,得到 Document
對象
Document document = docBuilder.parse("example.xml");
操作 DOM 樹
使用 Document 對象進行節點的增刪改查操作。
// 獲取根元素
Element root = document.getDocumentElement();
// 獲取名為 "element" 的所有節點
NodeList nodeList = root.getElementsByTagName("student");for (int i = 0; i < nodeList.getLength(); i++) {Node node = nodeList.item(i);if (node.getNodeType() == Node.ELEMENT_NODE) {Element element = (Element) node;System.out.println("學生信息: " + element.getTextContent());}
}
3)示例代碼
example.xml
<students><student><name>cheney</name><age>18</age></student>
</students>
Demo.java
mport org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class Demo {public static void main(String[] args) throws Exception{// 1. 初始化DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder docBuilder = factory.newDocumentBuilder();// 2. 解析String path = "D:\\workspace\\demo\\src\\main\\resources\\example.xml";Document document = docBuilder.parse(new File(path));// 3. 操作 DOM 樹Element root = document.getDocumentElement();NodeList nodeList = root.getElementsByTagName("student");for (int i = 0; i < nodeList.getLength(); i++) {Node node = nodeList.item(i);if (node.getNodeType() == Node.ELEMENT_NODE) {Element element = (Element) node;System.out.println("學生信息: " + element.getTextContent());}}}
}
輸出結果:
學生信息:
cheney
18
總結
解析 XML 文件的解析器有 SAX 解析器 和 DOM 解析器 兩種不同方式,各自有適用的場景。SAX 適用于大型 XML 文件,它基于事件的方式逐行解析,不需要將整個文檔加載到內存。DOM 適用于需要隨機訪問 XML 數據的情況,它將整個文檔加載到內存形成樹狀結構,允許直接操作節點。在選擇解析方式時,需根據具體需求和文檔大小來選擇適當的解析器。