Java使用dom4j解析XML
Java解析XML dom4j 簡(jiǎn)單易上手
在Java中使用dom4j庫(kù)解析XML是一種常見(jiàn)的方法。dom4j是一個(gè)開(kāi)源的、基于Java的XML解析庫(kù),它結(jié)合了DOM(文檔對(duì)象模型)、SAX(簡(jiǎn)單API for XML)和事件驅(qū)動(dòng)的優(yōu)點(diǎn),使得處理XML更加容易。
Maven項(xiàng)目添加依賴(lài)
<dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.3</version> </dependency>
XML示例文件
文件保存在項(xiàng)目resource目錄下:
<root> <name length="4" isFrom="true">張三</name> <age length="2" isFrom="false">99</age> <address length="5" region="中國(guó)">陜西</address> <hobbies> <hobby price="100">足球</hobby> <hobby price="10">籃球</hobby> <hobby price="100">排球</hobby> </hobbies> </root>
dom4j 操作xml文件
文件從resouce目錄下獲取到:
/** * 讀取XML文件并打印其結(jié)構(gòu)和內(nèi)容。 * @throws DocumentException 如果解析XML文件時(shí)發(fā)生錯(cuò)誤 */ private static void parseXmlGetInfo() throws DocumentException { // 創(chuàng)建一個(gè)SAXReader對(duì)象用于讀取XML文檔 SAXReader reader = new SAXReader(); // 讀取XML文件 加載XML文檔 你可以從文件、字符串或輸入流加載XML文檔。 Document document = reader.read(parseXmlFromFile.class.getClassLoader().getResourceAsStream("13.xml")); // 獲取根元素 一旦你有了Document對(duì)象,就可以通過(guò)它來(lái)訪(fǎng)問(wèn)XML文檔的內(nèi)容 Element root = document.getRootElement(); // 打印根元素的名稱(chēng) System.out.println("根元素名稱(chēng):" + root.getName()); // 遍歷根元素的所有子元素 for (Element child : root.elements()) { if (child.elements().isEmpty()) { // 如果子元素沒(méi)有子元素,則打印子元素的信息 System.out.println("-------------------------------------------"); System.out.println("---子元素名稱(chēng):" + child.getName()); System.out.println("---子元素文本:" + child.getText()); // 打印子元素的屬性值 System.out.println("---子元素屬性 length:" + child.attributeValue("length")); System.out.println("---子元素屬性 isForm:" + child.attributeValue("isForm")); System.out.println("---子元素屬性 region:" + child.attributeValue("region")); System.out.println("-------------------------------------------"); } else { // 如果子元素有子元素,則遍歷并打印孫元素的信息 for (Element grandChild : child.elements()) { System.out.println("-------------------------------------------"); System.out.println("------孫元素名稱(chēng):" + grandChild.getName()); System.out.println("------孫元素文本:" + grandChild.getText()); System.out.println("-------------------------------------------"); } } } }
結(jié)果:
處理XML文檔中的文本轉(zhuǎn)換
處理XML文檔中的文本轉(zhuǎn)換通常涉及到將文本從一種格式或編碼轉(zhuǎn)換為另一種。在使用dom4j進(jìn)行Java編程時(shí),可以采取以下幾種方法來(lái)處理這些轉(zhuǎn)換:
1. 文本編碼轉(zhuǎn)換
需要改變XML文件的編碼方式(例如從UTF-8轉(zhuǎn)換為ISO-8859-1),可以在讀取和寫(xiě)入XML文檔時(shí)指定編碼。
讀取時(shí)指定編碼
InputStream inputStream = new FileInputStream("xmlfile.xml"); InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8"); // 指定編碼 SAXReader saxReader = new SAXReader(); Document document = saxReader.read(reader);
寫(xiě)入時(shí)指定編碼
OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); // 設(shè)置輸出編碼 XMLWriter writer = new XMLWriter(new FileOutputStream("path/to/output.xml"), format); writer.write(document); writer.close();
2. 特殊字符轉(zhuǎn)義
在XML中,某些字符如 <, >, &, " 和 ’ 需要被轉(zhuǎn)義以避免語(yǔ)法錯(cuò)誤。dom4j會(huì)自動(dòng)處理這些特殊字符的轉(zhuǎn)義。
3. 處理CDATA
如果文本包含不應(yīng)該被解析器解釋的字符序列,可以放入CDATA段落中。dom4j也支持創(chuàng)建和處理CDATA部分。
Element cdataElement = root.addElement("cdataElement"); CDATA cdata = new CDATA("<b>This is bold text</b>"); cdataElement.add(cdata);
解析String類(lèi)型的XML
獲取到Document對(duì)象之后,其他操作相同。
/** * 讀取XML文件并將其內(nèi)容解析為字符串,然后打印出來(lái)。 * @throws Exception 如果讀取或解析過(guò)程中發(fā)生錯(cuò)誤 */ public static void parseXmlString() throws Exception { // 獲取資源文件的輸入流 InputStream inputStream = parseXmlFromFile.class.getClassLoader().getResourceAsStream("13.xml"); if (inputStream == null) { // 如果資源文件未找到,拋出IOException throw new IOException("Resource not found"); } StringBuilder stringBuilder = new StringBuilder(); try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { String line; // 逐行讀取輸入流的內(nèi)容并追加到StringBuilder中 while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line).append("\n"); } } catch (IOException e) { // 捕獲并重新拋出IOException throw new RuntimeException(e); } // 打印XML內(nèi)容 System.out.println(stringBuilder); // 將字符串解析為Document對(duì)象 Document document = DocumentHelper.parseText(stringBuilder.toString()); }
使用Xpath通過(guò)制定位置定位到XML中的節(jié)點(diǎn)元素
maven引入依賴(lài)jaxen
<dependency> <groupId>jaxen</groupId> <artifactId>jaxen</artifactId> <version>1.2.0</version> </dependency>
XPath的語(yǔ)法
絕對(duì)路徑表示方式:
以/開(kāi)頭的路徑表示絕對(duì)路徑,絕對(duì)路徑是從根元素開(kāi)始寫(xiě)。例如 /元素/子元素/子子元素……;
相對(duì)路徑的表達(dá)方式:
相對(duì)于當(dāng)前節(jié)點(diǎn)的元素繼續(xù)查找的節(jié)點(diǎn),不以/開(kāi)頭,…/表示上一個(gè)元素,./表示當(dāng)前元素;
全文搜索路徑方式:
例如//子元素,//子元素//子子元素,//子元素/子子元素。
注意:
表示無(wú)論中間有多少層,直接獲取所有子元素所有滿(mǎn)足條件的元素
表示只找一層
謂語(yǔ)(條件篩選形式)
例如 : //元素[@attr1=value]
/** * 使用XPath表達(dá)式從XML文件中選擇節(jié)點(diǎn)并打印相關(guān)信息。 * @throws DocumentException 如果解析XML文件時(shí)發(fā)生錯(cuò)誤 */ private static void useXpath() throws DocumentException { // 創(chuàng)建一個(gè)SAXReader對(duì)象用于讀取XML文檔 SAXReader reader = new SAXReader(); // 讀取XML文件 Document document = reader.read(parseXmlFromFile.class.getClassLoader().getResourceAsStream("13.xml")); // 使用XPath表達(dá)式獲取指定節(jié)點(diǎn) Element element = (Element) document.selectSingleNode("root/name"); // 打印節(jié)點(diǎn)的文本內(nèi)容 System.out.println(element.getText()); // 指定路徑獲取所有hobby節(jié)點(diǎn) List<Node> nodes = document.selectNodes("root/hobbies/hobby"); for (Node node : nodes) { // 打印每個(gè)hobby節(jié)點(diǎn)的文本內(nèi)容 System.out.println(node.getText()); } System.out.println("------------------"); // 使用通配符獲取所有hobby節(jié)點(diǎn) List<Node> nodeList = document.selectNodes("http://hobby"); for (Node node : nodeList) { // 打印每個(gè)hobby節(jié)點(diǎn)的文本內(nèi)容 System.out.println(node.getText()); } System.out.println("------------------"); // 使用XPath表達(dá)式獲取具有特定屬性的節(jié)點(diǎn) Element idElement = (Element) document.selectSingleNode("http://hobby[@price='10']"); // 打印節(jié)點(diǎn)的文本內(nèi)容 System.out.println(idElement.getText()); }
結(jié)果:
總結(jié)
使用dom4j結(jié)合XPath解析XML提供了一種強(qiáng)大而靈活的方式來(lái)查詢(xún)和操作XML數(shù)據(jù)。XPath表達(dá)式的簡(jiǎn)潔性和靈活性使得即使對(duì)于結(jié)構(gòu)復(fù)雜的XML文檔,也能夠快速準(zhǔn)確地定位所需的數(shù)據(jù)。同時(shí),dom4j提供了簡(jiǎn)單易用的API,方便開(kāi)發(fā)者進(jìn)行各種XML相關(guān)的操作。
到此這篇關(guān)于Java使用dom4j解析XML的文章就介紹到這了,更多相關(guān)Java dom4j解析XML內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis解決模糊查詢(xún)包含特殊字符問(wèn)題
這篇文章主要介紹了MyBatis解決模糊查詢(xún)包含特殊字符問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02java冷知識(shí):javac AbstractProcessor詳解
這篇文章主要介紹了java冷知識(shí):javac AbstractProcessor詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11PropertiesLoaderUtils 出現(xiàn)中文亂碼的解決方式
這篇文章主要介紹了PropertiesLoaderUtils 出現(xiàn)中文亂碼的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08Object類(lèi)toString()和equals()方法使用解析
這篇文章主要介紹了Object類(lèi)toString()和equals()方法使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02SpringBoot全局Controller返回值格式統(tǒng)一
本文主要介紹了SpringBoot全局Controller返回值格式統(tǒng)一,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Day16基礎(chǔ)不牢地動(dòng)山搖-Java基礎(chǔ)
這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08