Java使用dom4j解析XML
Java解析XML dom4j 簡單易上手
在Java中使用dom4j庫解析XML是一種常見的方法。dom4j是一個開源的、基于Java的XML解析庫,它結(jié)合了DOM(文檔對象模型)、SAX(簡單API for XML)和事件驅(qū)動的優(yōu)點(diǎn),使得處理XML更加容易。
Maven項(xiàng)目添加依賴
<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="中國">陜西</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文件時發(fā)生錯誤
*/
private static void parseXmlGetInfo() throws DocumentException {
// 創(chuàng)建一個SAXReader對象用于讀取XML文檔
SAXReader reader = new SAXReader();
// 讀取XML文件 加載XML文檔 你可以從文件、字符串或輸入流加載XML文檔。
Document document = reader.read(parseXmlFromFile.class.getClassLoader().getResourceAsStream("13.xml"));
// 獲取根元素 一旦你有了Document對象,就可以通過它來訪問XML文檔的內(nèi)容
Element root = document.getRootElement();
// 打印根元素的名稱
System.out.println("根元素名稱:" + root.getName());
// 遍歷根元素的所有子元素
for (Element child : root.elements()) {
if (child.elements().isEmpty()) {
// 如果子元素沒有子元素,則打印子元素的信息
System.out.println("-------------------------------------------");
System.out.println("---子元素名稱:" + 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("------孫元素名稱:" + grandChild.getName());
System.out.println("------孫元素文本:" + grandChild.getText());
System.out.println("-------------------------------------------");
}
}
}
}
結(jié)果:

處理XML文檔中的文本轉(zhuǎn)換
處理XML文檔中的文本轉(zhuǎn)換通常涉及到將文本從一種格式或編碼轉(zhuǎn)換為另一種。在使用dom4j進(jìn)行Java編程時,可以采取以下幾種方法來處理這些轉(zhuǎn)換:
1. 文本編碼轉(zhuǎn)換
需要改變XML文件的編碼方式(例如從UTF-8轉(zhuǎn)換為ISO-8859-1),可以在讀取和寫入XML文檔時指定編碼。
讀取時指定編碼
InputStream inputStream = new FileInputStream("xmlfile.xml");
InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8"); // 指定編碼
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(reader);
寫入時指定編碼
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)義以避免語法錯誤。dom4j會自動處理這些特殊字符的轉(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類型的XML
獲取到Document對象之后,其他操作相同。
/**
* 讀取XML文件并將其內(nèi)容解析為字符串,然后打印出來。
* @throws Exception 如果讀取或解析過程中發(fā)生錯誤
*/
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對象
Document document = DocumentHelper.parseText(stringBuilder.toString());
}
使用Xpath通過制定位置定位到XML中的節(jié)點(diǎn)元素
maven引入依賴jaxen
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
XPath的語法
絕對路徑表示方式:
以/開頭的路徑表示絕對路徑,絕對路徑是從根元素開始寫。例如 /元素/子元素/子子元素……;
相對路徑的表達(dá)方式:
相對于當(dāng)前節(jié)點(diǎn)的元素繼續(xù)查找的節(jié)點(diǎn),不以/開頭,…/表示上一個元素,./表示當(dāng)前元素;
全文搜索路徑方式:
例如//子元素,//子元素//子子元素,//子元素/子子元素。
注意:
表示無論中間有多少層,直接獲取所有子元素所有滿足條件的元素
表示只找一層
謂語(條件篩選形式)
例如 : //元素[@attr1=value]
/**
* 使用XPath表達(dá)式從XML文件中選擇節(jié)點(diǎn)并打印相關(guān)信息。
* @throws DocumentException 如果解析XML文件時發(fā)生錯誤
*/
private static void useXpath() throws DocumentException {
// 創(chuàng)建一個SAXReader對象用于讀取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) {
// 打印每個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) {
// 打印每個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)大而靈活的方式來查詢和操作XML數(shù)據(jù)。XPath表達(dá)式的簡潔性和靈活性使得即使對于結(jié)構(gòu)復(fù)雜的XML文檔,也能夠快速準(zhǔn)確地定位所需的數(shù)據(jù)。同時,dom4j提供了簡單易用的API,方便開發(fā)者進(jìn)行各種XML相關(guān)的操作。
到此這篇關(guān)于Java使用dom4j解析XML的文章就介紹到這了,更多相關(guān)Java dom4j解析XML內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java冷知識:javac AbstractProcessor詳解
這篇文章主要介紹了java冷知識:javac AbstractProcessor詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
PropertiesLoaderUtils 出現(xiàn)中文亂碼的解決方式
這篇文章主要介紹了PropertiesLoaderUtils 出現(xiàn)中文亂碼的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
Object類toString()和equals()方法使用解析
這篇文章主要介紹了Object類toString()和equals()方法使用解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02
SpringBoot全局Controller返回值格式統(tǒng)一
本文主要介紹了SpringBoot全局Controller返回值格式統(tǒng)一,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07
Day16基礎(chǔ)不牢地動山搖-Java基礎(chǔ)
這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08

