欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java使用dom4j解析XML

 更新時(shí)間:2024年12月12日 08:56:32   作者:山風(fēng)wind  
dom4j是一個(gè)開(kāi)源的、基于Java的XML解析庫(kù),而在Java中使用dom4j庫(kù)解析XML是一種常見(jiàn)的方法,下面就跟隨小編一起來(lái)學(xué)習(xí)一下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)題

    這篇文章主要介紹了MyBatis解決模糊查詢(xún)包含特殊字符問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • java冷知識(shí):javac AbstractProcessor詳解

    java冷知識(shí):javac AbstractProcessor詳解

    這篇文章主要介紹了java冷知識(shí):javac AbstractProcessor詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java使用Collections.sort()排序的方法

    Java使用Collections.sort()排序的方法

    這篇文章介紹了Java使用Collections.sort()排序的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 詳解java重載與覆寫(xiě)的區(qū)別

    詳解java重載與覆寫(xiě)的區(qū)別

    很多同學(xué)會(huì)重載和重寫(xiě)分不清楚,這篇文章主要介紹了詳解java重載與覆寫(xiě)的區(qū)別,有需要的朋友可以了解一下。
    2016-11-11
  • PropertiesLoaderUtils 出現(xiàn)中文亂碼的解決方式

    PropertiesLoaderUtils 出現(xiàn)中文亂碼的解決方式

    這篇文章主要介紹了PropertiesLoaderUtils 出現(xiàn)中文亂碼的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Object類(lèi)toString()和equals()方法使用解析

    Object類(lèi)toString()和equals()方法使用解析

    這篇文章主要介紹了Object類(lèi)toString()和equals()方法使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • java 中鎖的性能提高辦法

    java 中鎖的性能提高辦法

    這篇文章主要介紹了java 中鎖的性能提高辦法的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • transactionAttributes各屬性意義及配置

    transactionAttributes各屬性意義及配置

    這篇文章主要介紹了transactionAttributes各屬性意義及配置,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • SpringBoot全局Controller返回值格式統(tǒng)一

    SpringBoot全局Controller返回值格式統(tǒng)一

    本文主要介紹了SpringBoot全局Controller返回值格式統(tǒng)一,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Day16基礎(chǔ)不牢地動(dòng)山搖-Java基礎(chǔ)

    Day16基礎(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

最新評(píng)論