【Java 基礎】27 XML 解析

文章目錄

    • 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 數據的情況,它將整個文檔加載到內存形成樹狀結構,允許直接操作節點。在選擇解析方式時,需根據具體需求和文檔大小來選擇適當的解析器。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210801.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210801.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210801.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Jupyter notebook修改背景主題

打開Anaconda Prompt&#xff0c;輸入以下內容 1. pip install --upgrade jupyterthemes 下載對應背景主題包 出現Successfully installed jupyterthemes-0.20.0 lesscpy-0.15.1時&#xff0c;說明已經下載安裝完成 2. jt -l 查看背景主題列表 3. jt -t 主題名稱&#xff08;…

【LeeCode】18.四數之和

給你一個由 n 個整數組成的數組 nums &#xff0c;和一個目標值 target 。請你找出并返回滿足下述全部條件且不重復的四元組 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若兩個四元組元素一一對應&#xff0c;則認為兩個四元組重復&#xff09;&#xff1a; 0 < a, …

mysql的BIT數值類型

MySQL :: MySQL 8.2 Reference Manual :: 11.1.5 Bit-Value Type - BIT MySQL :: MySQL 8.2 Reference Manual :: 9.1.5 Bit-Value Literals BIT類型用來存放bit值&#xff0c;每一位是0或者1&#xff0c;允許1-64位。 例如&#xff0c;下面表定義了new這列的類型為8位的BIT…

NestJS的微服務實現

1.1 基本概念 微服務基本概念&#xff1a;微服務就是將一個項目拆分成多個服務。舉個簡單的例子&#xff1a;將網站的登錄功能可以拆分出來做成一個服務。 微服務分為提供者和消費者&#xff0c;如上“登錄服務”就是一個服務提供者&#xff0c;“網站服務器”就是一個服務消…

Python如何實現數據驅動的接口自動化測試

大家在接口測試的過程中&#xff0c;很多時候會用到對CSV的讀取操作&#xff0c;本文主要說明Python3對CSV的寫入和讀取。下面話不多說了&#xff0c;來一起看看詳細的介紹吧。 1、需求 某API&#xff0c;GET方法&#xff0c;token,mobile,email三個參數 token為必填項mobil…

python在線讀取傳奇列表,并解析為需要的JSON格式

python在線讀取傳奇列表,并解析為需要的JSON格式,以下為傳奇中使用的TXT列表格式, [Server] ; 使用“/”字符分開顏色,也可以不使用顏色,支持以前的舊格式,只有標題和服務器標題支持顏色 ; 標題/顏色代碼(0-255)|服務器標題/顏色代碼(0-255)|服務器名稱|服務器IP|服務器端…

探索人工智能領域——每日20個名詞詳解【day13】

目錄 前言 正文 總結 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高興與大家相識&#xff0c;希望我的博客能對你有所幫助。 &#x1f4a1;本文由Filotimo__??原創&#xff0c;首發于CSDN&#x1f4da;。 &#x1f4e3;如需轉載&#xff0c;請事先與我聯系以…

Axure網頁端高交互組件庫, 下拉菜單文件上傳穿梭框日期城市選擇器

作品說明 組件數量&#xff1a;共 11 套 兼容軟件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 應用領域&#xff1a;web端原型設計、桌面端原型設計 作品特色 本作品為「web端組件庫」&#xff0c;高保真高交互 (帶仿真功能效果)&#xff1b;運用了動態面板、中繼…

UniGui使用CSSUniTreeMenu滾動條

有些人反應UniTreeMenu當菜單項目比較多的時候會超出但是沒有出滾動條&#xff0c;只需要添加如下CSS 老規矩&#xff0c;unitreemeu的layout的componentcls里添加bbtreemenu&#xff0c;然后在css里添加 .bbtreemenu .x-box-item{ overflow-y: auto; } 然后當內容超出后就會…

【數據結構第 6 章 ②】- 用 C 語言實現鄰接矩陣

目錄 一、鄰接矩陣表示法 二、AMGraph.h 三、AMGraph.c 四、Test.c 【數據結構第 6 章 ① 】- 圖的定義和基本術語-CSDN博客 由于圖的結構比較復雜&#xff0c;任意兩個頂點之間都可能存在聯系&#xff0c;因此無法以數據元素在存儲區中的物理位置來表示元素之間的關系&…

SpringCloud網關介紹

一、Gateway簡介 1、官網 上一代zuul 1.X&#xff1a;https://github.com/Netflix/zuul/wiki 當前gateway&#xff1a;https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/ 2、是什么 SpringCloud Gateway是SpringCloud的一個全…

.NET Core 依賴注入 Microsoft.Extensions.DependencyInjection

文章目錄 前言什么是依賴注入C# 使用依賴注入框架介紹 Microsoft.Extensions.DependencyInjectionNuget安裝簡單單例使用打印結果 自動裝配舉例自動裝配測試用例打印結果自動裝配執行順序測試用例有歧義構造函數漸進式構造函數循環依賴 自動裝配結論 手動裝配手動注入別名注入 …

Git:版本控制的藝術與實踐

引言&#xff1a; 在軟件開發領域&#xff0c;版本控制是至關重要的一環。它幫助我們跟蹤代碼的變化、管理團隊協作、回溯歷史記錄以及解決沖突等。而Git作為目前最流行的分布式版本控制系統&#xff0c;已經成為了開發者們的必備工具。本文將深入探討Git的核心概念、常用命令以…

使用Docker安裝Superset并設置Oracle訪問和使用PG作Meta數據庫

一、安裝 Docker 安裝一個linux&#xff0c;可以是Centos或Ubuntu&#xff0c;如果是Centos 7.X&#xff0c;那么要注意先將系統自帶的docker先刪除。下文以Centos7.9為例 #刪除自帶的不完整版本 yum remove docker docker-client docker-client-latest \docker-common docker-…

調用win32 api獲取電腦名字和系統目錄

學習一下幾個函數的功能&#xff0c;和調用方式&#xff1b; void CBasenameView::OnDraw(CDC* pDC) {CBasenameDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;TCHAR myname1[50], myname2[50], mydirname1[50], myd…

常見的Linux系統版本

在介紹常見的Linux系統版本之前&#xff0c;首先需要區分Linux系統內核與Linux發行套件系統的不同。Linux系統內核指的是一個由Linus Torvalds負責維護&#xff0c;提供硬件抽象層、硬盤及文件系統控制及多任務功能的系統核心程序。而Linux發行套件系統是我們常說的Linux操作系…

【Vue+Python】—— 基于Vue與Python的圖書管理系統

文章目錄 &#x1f356; 前言&#x1f3b6;一、項目描述?二、項目展示&#x1f3c6;三、撒花 &#x1f356; 前言 【VuePython】—— 基于Vue與Python的圖書管理系統 &#x1f3b6;一、項目描述 描述&#xff1a; 本項目為《基于Vue與Python的圖書管理系統》&#xff0c;項目…

Minio保姆級教程

轉載自&#xff1a;www.javaman.cn Minio服務器搭建和整合 1、centos安裝minio 1.1、創建安裝目錄 mkdir -p /home/minio1.2、在線下載minio #進入目錄 cd /home/minio #下載 wget https://dl.minio.io/server/minio/release/linux-amd64/minio1.3、minio配置 1.3.1、添加…

Flutter筆記:滑塊及其實現分析1

Flutter筆記 滑塊分析1 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 郵箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134900784 本文從設計角度&#…

SQL命令---刪除字段

介紹 使用sql語句刪除表字段。 命令 alter table 表名 drop 字段名;例子 刪除a表中的name字段。 alter table a drop name;下面是執行刪除后的表結構&#xff1a;