XML和Dom4j

Or_One發表於2020-12-14

XML和Dom4j

資料傳輸的時候直接傳輸字串是不可行的, 所以我們使用一種特別的方式來傳輸, 就是XML.

  • XML 指可擴充套件標記語言EXtensible Markup Language

  • XML 是一種標記語言,很類似 HTML,HTML檔案也是XML文件

  • XML 的設計宗旨是傳輸資料,而非顯示資料

  • XML 標籤沒有被預定義。您需要自行定義標籤

  • XML 被設計為具有自我描述性(就是易於閱讀)

  • XML 是 W3C 的推薦標準

    W3C在1988年2月釋出1.0版本,2004年2月又釋出1.1版本,單因為1.1版本不能向下相容1.0版本,所以1.1沒有人用。同時,在2004年2月W3C又釋出了1.0版本的第三版。我們要學習的還是1.0版本。

XML 與 HTML 的主要差異

  • XML 不是 HTML 的替代。
  • XML 和 HTML 為不同的目的而設計。
  • XML 被設計為傳輸和儲存資料,其焦點是資料的內容
  • HTML 被設計用來顯示資料,其焦點是資料的外觀
  • HTML 旨在顯示資訊,而 XML 旨在傳輸資訊。

XML檔案案例編寫person.xml檔案

需求

編寫xml文件,用於描述人員資訊,person代表一個人員,id是人員的屬性代表人員編號。人員資訊包括age年齡、name姓名、sex性別資訊。

效果

使用瀏覽器執行person.xml檔案效果如下

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-25hk23My-1607882146788)(img/06.png)]

實現步驟

步驟1:使用idea開發工具,選擇當前專案滑鼠右鍵新建“”,如圖

在這裡插入圖片描述

步驟2:編寫檔案person.xml檔案,內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<person id="110">
	<age>18</age>		<!--年齡-->
	<name>張三</name>	  <!--姓名-->
	<sex/>				<!--性別-->
</person>

步驟3:如圖點選瀏覽器執行

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-JrdIH1lm-1607882146800)(img/05.png)]

步驟4:瀏覽器執行效果如下

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-TQkLaxIw-1607882146803)(img/06.png)]

XML作用和組成元素

  • XML的作用

XML在企業開發中主要有兩種應用場景:
1)XML可以儲存資料 , 作為資料交換的載體(使用XML格式進行資料的傳輸)。
2)XML也可以作為
配置檔案
,例如後面框架階段我們學習的Spring框架的配置(applicationContext.xml)都是通過XML進行配置的(企業開發中經常使用的)

  • XML的組成元素

XML檔案中常見的組成元素有:文件宣告、元素、屬性、註釋、轉義字元、字元區

文件宣告
<?xml version="1.0" encoding="utf-8" ?>
  1. 使用IDE建立xml檔案時就帶有文件宣告.
  2. 文件宣告必須為<?xml開頭,以?>結束
  3. 文件宣告必須從文件的0行0列位置開始
  4. 文件宣告中常見的兩個屬性:
    • version:指定XML文件版本。必須屬性,這裡一般選擇1.0;
    • enconding:指定當前文件的編碼,可選屬性,預設值是utf-8;
元素element
格式1:<person></person>
格式2:<person/>
  1. 元素是XML文件中最重要的組成部分;
  2. 普通元素的結構由開始標籤、元素體、結束標籤組成。
  3. 元素體:元素體可以是元素,也可以是文字,例如:<person><name>張三</name></person>
  4. 空元素:空元素只有標籤,而沒有結束標籤,但元素必須自己閉合,例如:<sex/>
  5. 元素命名
    • 區分大小寫
    • 不能使用空格,不能使用冒號
    • 不建議以XML、xml、Xml開頭
  6. 格式化良好的XML文件,有且僅有一個根元素。
屬性
<person id="110">
  1. 屬性是元素的一部分,它必須出現在元素的開始標籤中
  2. 屬性的定義格式:屬性名=“屬性值”,其中屬性值必須使用單引或雙引號括起來
  3. 一個元素可以有0~N個屬性,但一個元素中不能出現同名屬性
  4. 屬性名不能使用空格 , 不要使用冒號等特殊字元,且必須以字母開頭
註釋
<!--註釋內容-->

XML的註釋與HTML相同,既以<!--開始,-->結束。

轉義字元

​ XML中的轉義字元與HTML一樣。因為很多符號已經被文件結構所使用,所以在元素體或屬性值中想使用這些符號就必須使用轉義字元(也叫實體字元),例如:">"、"<"、"’"、"""、"&"。

字元預定義的轉義字元說明
<&lt;小於
>&gt;大於
"&quot;雙引號
&apos;單引號
&&amp;和號

注意:嚴格地講,在 XML 中僅有字元 “<“和”&” 是非法的。省略號、引號和大於號是合法的,但是把它們替換為實體引用是個好的習慣。

轉義字元應用示例:

​ 假如您在 XML 文件中放置了一個類似 “<” 字元,那麼這個文件會產生一個錯誤,這是因為解析器會把它解釋為新元素的開始。因此你不能這樣寫:

<message>if salary < 1000 then</message>

為了避免此類錯誤,需要把字元 “<” 替換為實體引用,就像這樣:

<message>if salary &lt; 1000 then</message>
字元區(瞭解)
<![CDATA[
	文字資料
]]>
  1. CDATA 指的是不應由 XML 解析器進行解析的文字資料(Unparsed Character Data)
  2. CDATA 部分由 “<![CDATA[" 開始,由 "]]>” 結束;
  3. 當大量的轉義字元出現在xml文件中時,會使XML文件的可讀性大幅度降低。這時如果使用CDATA段就會好一些。

注意:

​ CDATA 部分不能包含字串 “]]>”。也不允許巢狀的 CDATA 部分。

​ 標記 CDATA 部分結尾的 “]]>” 不能包含空格或折行。

XML檔案的約束-DTD約束

在XML技術裡,可以編寫一個文件來約束一個XML文件的書寫規範,這稱之為XML約束。
常見的xml約束:DTD、Schema
注意:我們對於約束的要求是能通過已寫好的約束檔案編寫xml文件.

DTD是文件型別定義(Document Type Definition)。DTD 可以定義在 XML 文件中出現的元素、這些元素出現的次序、它們如何相互巢狀以及XML文件結構的其它詳細資訊。

約束體驗

體驗效果說明:當編寫xml文件時不符合指定dtd約束時,進行提示xml編寫錯誤,如下圖:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Xx2GInoq-1607882146804)(img/07.png)]

體驗步驟:

步驟1:複製bookshelf.dtd檔案

步驟2:bookshelf.dtd檔案內容如下

<!ELEMENT 書架 (書+)>
<!ELEMENT 書 (書名,作者,售價)><!--約束元素書的子元素必須為書名、作者、售價-->
<!ELEMENT 書名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售價 (#PCDATA)>

步驟三:新建books.xml,程式碼如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 書架 SYSTEM "bookshelf.dtd"><!--指定使用bookshelf.dtd檔案約束當前xml文件-->
<書架>
    <>
        <書名>JavaWeb開發教程</書名>
        <作者>張孝祥</作者>
        <售價>100.00元</售價>
    </>
    <>
        <書名>三國演義</書名>
        <作者>羅貫中</作者>
        <售價>100.00元</售價>
        <測試>hello</測試><!--不符合約束,書的子元素必須為書名、作者、售價-->
    </>
</書架>

步驟四:idea開發工具books.xml的dtd約束驗證不通過的效果如下

在這裡插入圖片描述

​在企業實際開發中,我們很少自己編寫DTD約束文件,通常情況下通過框架提供的DTD約束文件編寫對應的XML文件。所以這一知識點的要求是可以根據DTD約束文件內容編寫XML文件。

文件宣告
  1. 內部DTD,在XML文件內部嵌入DTD,只對當前XML有效。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE 根元素 [...//具體語法]><!--內部DTD-->
    <根元素>
    </根元素>
    
    
  2. 外部DTD—本地DTD,DTD文件在本地系統上,企業內部自己專案使用。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE 根元素 SYSTEM "bookshelf.dtd"><!--外部本地DTD-->
    <根元素>
    </根元素>
    
    
  3. 外部DTD—公共DTD,DTD文件在網路上,一般都有框架提供 , 也是我們使用最多的.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
    </web-app>
    
    
元素宣告
  1. 約束元素的巢狀層級

    語法

    <!ELEMENT 父標籤 (子標籤1,子標籤2,…)>
    
    

    程式碼

    <!ELEMENT 書架 (書+)>  <!--約束根元素是"書架","書架"子元素為"書",“+”為數量詞,請看下面介紹-->
    <!ELEMENT 書 (書名,作者,售價)><!--約束"書"子元素依次為“書名”、“作者”、“售價”,“+”書元素至少1次-->
    
    
  2. 約束元素體裡面的資料

    語法

    <!ELEMENT 標籤名字 標籤型別>
    
    

    標籤型別

    標籤型別程式碼寫法說明
    PCDATA(#PCDATA)被解釋的字串資料
    EMPTYEMPTY即空元素,例如<hr/>
    ANYANY即任意型別

    程式碼

    <!ELEMENT 書名 (#PCDATA)>  	<!--"書名"元素體為字串資料-->
    <!ELEMENT 作者 (#PCDATA)>		<!--"作者"元素體為字串資料-->
    <!ELEMENT 售價 (#PCDATA)>		<!--"售價"元素體為字串資料-->
    <!ELEMENT 出版日期 ANY>		   <!--"出版日期"元素體為任意型別-->
    <!ELEMENT 版本號 EMPTY>		<!--"版本號"元素體為空元素-->
    
    
  3. 數量詞(掌握)

    數量詞符號含義
    *表示元素可以出現0到多個
    +表示元素可以出現至少1個
    ?表示元素可以是0或1個
    ,表示元素需要按照順序顯示
    |表示元素需要選擇其中的某一個
屬性宣告

語法

<!ATTLIST 標籤名稱 
		屬性名稱1 屬性型別1 屬性說明1
		屬性名稱2 屬性型別2 屬性說明2
		…
>

屬性型別

屬性型別含義
CDATA代表屬性是文字字串, eg:<!ATTLIST 屬性名 CDATA 屬性說明>
ID程式碼該屬性值唯一,不能以數字開頭, eg:<!ATTLIST 屬性名 ID 屬性說明>
ENUMERATED代表屬性值在指定範圍內進行列舉 Eg:<!ATTLIST屬性名 (社科類|工程類|教育類) “社科類”> “社科類"是預設值,屬性如果不設定預設值就是"社科類”

屬性說明

屬性說明含義
#REQUIRED代表屬性是必須有的
#IMPLIED代表屬性可有可無
#FIXED代表屬性為固定值,實現方式:book_info CDATA #FIXED “固定值”

程式碼

<!ATTLIST 書									<!--設定"書"元素的的屬性列表-->
		id ID #REQUIRED						 <!--"id"屬性值為必須有-->
		編號 CDATA #IMPLIED				    <!--"編號"屬性可有可無-->
		出版社 (清華|北大|傳智播客) "傳智播客"   <!--"出版社"屬性值是列舉值,預設為“傳智播客”-->
		type CDATA #FIXED "IT"                <!--"type"屬性為文字字串並且固定值為"IT"-->
>

schema約束

schema和DTD一樣, 也是一種XML檔案的約束.

Schema 語言也可作為 XSD(XML Schema Definition)。

Schema 比DTD強大,是DTD代替者。

Schema 本身也是XML文件,單Schema文件副檔名為xsd,而不是xml。

Schema 功能更強大,資料型別約束更完善。

約束體驗

體驗效果說明:體驗schema約束XML文件中對元素體資料型別的約束。效果如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-BGejP6z5-1607882146810)(img/12.png)]

DTD約束無法對具體資料型別進行約束,所以開發工具沒有任何錯誤提示,如下效果:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-15hJNTaT-1607882146812)(img/11.png)]

實現步驟

步驟1:複製schema約束檔案bookshelf.xsd,其中已對售價約束了資料型別,程式碼如下

<?xml version="1.0" encoding="UTF-8" ?>
<!--
	傳智播客DTD教學例項文件.將註釋中的以下內容複製到要編寫的xml的宣告下面
	複製內容如下:
	<書架 xmlns="http://www.itcast.cn"
		  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		  xsi:schemaLocation="http://www.itcast.cn bookshelf.xsd"
    >
 -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.itcast.cn"
           elementFormDefault="qualified">
        <xs:element name='書架' >
                <xs:complexType>
                        <xs:sequence maxOccurs='unbounded' >
                                <xs:element name='書' >
                                        <xs:complexType>
                                                <xs:sequence>
                                                     <xs:element name='書名' type='xs:string' />
                                                     <xs:element name='作者' type='xs:string' />
                                                     <xs:element name='售價' type='xs:double' />
                                                </xs:sequence>
                                        </xs:complexType>
                                </xs:element>
                        </xs:sequence>
                </xs:complexType>
        </xs:element>
</xs:schema>


步驟2:新建books2.xml使用schema約束檔案bookshelf.xsd,程式碼如下

<?xml version="1.0" encoding="UTF-8"?>
<書架
xmlns="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn bookshelf.xsd"
><!--指定schema文件約束當前XML文件-->
    <>
        <書名>JavaScript網頁開發</書名>
        <作者>張孝祥</作者>
        <售價>abc</售價>
    </>
</書架>

步驟3:開發工具提示效果

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-AWeT30fz-1607882146814)(img/12.png)]

名稱空間

一個XML文件最多可以使用一個DTD檔案,但一個XML文件中使用多個Schema檔案,若這些Schema檔案中定義了相同名稱的元素時,使用的時候就會出現名字衝突。這就像一個Java檔案中使用了import java.util.*import java.sql.*時,在使用Date類時,那麼就不明確Date是哪個包下的Date了。同理 , 在XML文件中就需要通過名稱空間(namespace)來區分元素和屬性是來源於哪個約束中的。名稱空間就在在根元素後面的內容 , 使用xmlns到引入約束 。

​ 當一個XML文件中需要使用多個Schema檔案的時候 , 有且僅有一個使用預設的 , 其他的名稱空間都需要起別名 。參考applicationContext.xml檔案(spring框架的配置檔案)

 xmlns="http://www.itcast.cn"    
 	<!-- 預設的名稱空間.使用此約束中的元素的時候只需要寫元素名即可 例如:<書></書> -->
 
 xmlns:aa="http://java.sun.com"
 	<!-- aa就是此約束的別名,使用此約束中的元素的時候就需要加上別名 例如:<aa:書></aa:書> -->

​總之名稱空間就是用來處理元素和屬性的名稱衝突問題,與Java中的包是同一用途。如果每個元素和屬性都有自己的名稱空間,那麼就不會出現名字衝突問題,就像是每個類都有自己所在的包一樣,那麼類名就不會出現衝突。

雖然schema功能比dtd強大,但是編寫要比DTD複雜,同樣以後我們在企業開發中也很少會自己編寫schema檔案。

Dom4j-XML解析

當將資料儲存在XML後,我們就希望通過程式獲取XML的內容。如果我們使用Java基礎所學的IO知識是可以完成的,不過你學要非常繁瑣的操作才可以完成,且開發中會遇到不同問題(只讀、讀寫)。人們為不同問題提供不同的解析方式,使用不同的解析器進行解析,方便開發人員操作XML。

解析方式和解析器

  • 開發中比較常見的解析方式有三種,如下:

    1. DOM:要求解析器把整個XML文件裝載到記憶體,並解析成一個Document物件

      a)優點:元素與元素之間保留結構關係,故可以進行增刪改查操作。

      b)缺點:XML文件過大,可能出現記憶體溢位

    2. SAX:是一種速度更快,更有效的方法。她逐行掃描文件,一邊掃描一邊解析。並以事件驅動的方式進行具體解析,沒執行一行,都觸發對應的事件。(瞭解)

      a)優點:處理速度快,可以處理大檔案

      b)缺點:只能讀,逐行後將釋放資源,解析操作繁瑣。

    3. PULL:Android內建的XML解析方式,類似SAX。(瞭解)

  • 解析器,就是根據不同的解析方式提供具體實現。有的解析器操作過於繁瑣,為了方便開發人員,有提供易於操作的解析開發包

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-HBsmGFhZ-1607882146816)(img/13.png)]

  • 常見的解析開發包

    • JAXP:sun公司提供支援DOM和SAX開發包
    • Dom4j:比較簡單的的解析開發包(常用)
    • JDom:與Dom4j類似
    • Jsoup:功能強大DOM方式的XML解析開發包,尤其對HTML解析更加方便(專案中講解)

Dom4j的基本使用

DOM解析原理及結構模型

  • 解析原理

    XML DOM 和 HTML DOM一樣,XML DOM 將整個XML文件載入到記憶體,生成一個DOM樹,並獲得一個Document物件,通過Document物件就可以對DOM進行操作。以下面books.xml文件為例。

    <?xml version="1.0" encoding="UTF-8"?>
    <books>
        <book id="0001">
            <name>JavaWeb開發教程</name>
            <author>張孝祥</author>
            <sale>100.00元</sale>
        </book>
        <book id="0002">
            <name>三國演義</name>
            <author>羅貫中</author>
            <sale>100.00元</sale>
        </book>
    </books>
    
    
  • 結構模型

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-hu0dMt0V-1607882146818)(img/15.png)]

    DOM中的核心概念就是節點,在XML文件中的元素、屬性、文字,在DOM中都是節點!所有的節點都封裝到了Document物件中。

  • 引入dom4j的jar包

    需要引入“jar/dom4j-1.6.1.jar” , 在IDEA中,選擇專案滑鼠右鍵—>彈出選單–>open Module settings”–>Dependencies–>±->JARs or directories…

    找到dom4j-1.6.1.jar,成功新增之後點選"OK" 即可.

  • dom4j 必須使用核心類SaxReader載入xml文件獲得Document,通過Document物件獲得文件的根元素,然後就可以操作了。

常用的方法

SaxReader物件
方法作用
new SaxReader()構造器
Document read(String url)載入執行xml文件
Document物件
方法作用
Element getRootElement()獲得根元素
Element物件
方法作用
List elements([String ele] )獲得指定名稱的所有子元素。可以不指定名稱
Element element([String ele])獲得指定名稱第一個子元素。可以不指定名稱
String getName()獲得當前元素的元素名
String attributeValue(String attrName)獲得指定屬性名的屬性值
String elementText(Sting ele)獲得指定名稱子元素的文字值
String getText()獲得當前元素的文字內容

方法演示

複製資料下的常用xml中"books.xml",內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book id="0001">
        <name>JavaWeb開發教程</name>
        <author>張孝祥</author>
        <sale>100.00元</sale>
    </book>
    <book id="0002">
        <name>三國演義</name>
        <author>羅貫中</author>
        <sale>100.00元</sale>
    </book>
</books>

注意:為了便於解析,此xml中沒有新增約束

解析此檔案,獲取每本書的id值,以及書本名稱,作者名稱和價格.

public class Demo {
    public static void main(String[] args) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(Demo.class.getResourceAsStream("/books.xml"));
        //獲取根元素 books
        Element elemRoot = document.getRootElement();

        //獲取根元素的所有子元素 book
        List<Element>list = elemRoot.elements();
        //遍歷集合 獲取每一個book
        for(Element element : list){
            //獲取book的id屬性
            String id =element.attributeValue("id");
            System.out.println("id : "+ id);

            //獲取book下的所有子元素 name,author,sale
            List<Element>listElem = element.elements();
            //遍歷集合 獲取每一個子元素
            for(Element elem : listElem){
                //元素名
                String name = elem.getName();
                //文字值
                String text = elem.getText();
                System.out.println("--- " + name + " : " + text);
            }
        }
    }
}

Dom4J結合XPath解析XML

XPath 使用路徑表示式來選取HTML 文件中的元素節點或屬性節點。節點是通過沿著路徑 (path) 來選取的。XPath在解析HTML文件方面提供了一獨樹一幟的路徑思想。

XPath使用步驟

步驟1:匯入jar包(dom4j和jaxen-1.1-beta-6.jar)

步驟2:通過dom4j的SaxReader獲取Document物件

步驟3: 利用Xpath提供的api,結合xpaht的語法完成選取XML文件元素節點進行解析操作。

document常用的api

方法作用
List selectNodes(“表示式”)獲取符合表示式的元素集合
Element selectSingleNode(“表示式”)獲取符合表示式的唯一元素

XPath語法(瞭解)

  • XPath表示式,就是用於選取HTML文件中節點的表示式字串。

    獲取XML文件節點元素一共有如下4種XPath語法方式:

    1. 絕對路徑表示式方式 例如: /元素/子元素/子子元素…
    2. 相對路徑表示式方式 例如: 子元素/子子元素… 或者 ./子元素/子子元素…
    3. 全文搜尋路徑表示式方式 例如: //子元素//子子元素
    4. 謂語(條件篩選)方式 例如: //元素[@attr1=value]
  • 獲取不同節點語法

    獲取型別語法程式碼
    獲取元素節點元素名稱
    獲取屬性節點@屬性名稱
絕對路徑表示式(瞭解)
  • 絕對路徑介紹

    格式: String xpath="/元素/子元素/子子元素…";

    ​ 絕對路徑是以“/”開頭,一級一級描述標籤的層級路徑就是絕對路徑,這裡注意不可以跨層級

    ​ 絕對路徑是從根元素開始寫路徑的,這裡開頭的“/”代表HTML文件根元素,所以在絕對路徑中不可以寫根元素路徑

  • 演示需求(解析XML文件為"資料\常用xml檔案\index.html")

    需求:採用絕對路徑獲取從根節點開始逐層的html/body/div/ul/li節點列表並列印資訊
    
    
相對路徑表示式(瞭解)
  • 相對路徑介紹

    格式: String xpath1=“子元素/子子元素…”;//獲取相對當前路徑元素裡面的子元素的選取

    ​ String xpath2="./子元素/子子元素";//"./"代表當前元素路徑位置

    ​ String xpath3="/子元素/子子元素";//功能與xpath1格式功能一樣

    ​ 相對路徑就是相對當前節點元素位置繼續查詢節點,需要使用JXNode.sel(xpath)進行執行相對路徑表示式。

全文搜尋路徑表示式(瞭解)
  • 全文搜尋路徑介紹

    格式: String xpath1="//子元素//子子元素";

    ​ 一個“/”符號,代表逐級寫路徑

    ​ 2個“//”符號,不用逐級寫路徑,可以直接選取到對應的節點,是全文搜尋匹配的不需要按照逐層級

謂語(條件篩選 瞭解)
  • 介紹

    謂語,又稱為條件篩選方式,就是根據條件過濾判斷進行選取節點

    格式:
    ​ String xpath1="//元素[@attr1=value]";//獲取元素屬性attr1=value的元素

    ​ String xpath2="//元素[@attr1>value]/@attr1"//獲取元素屬性attr1>value的d的所有attr1的值

    ​ String xpath3="//元素[@attr1=value]/text()";//獲取符合條件元素體的自有文字資料

    String xpath4="//元素[@attr1=value]/html()";//獲取符合條件元素體的自有html程式碼資料。

    ​ String xpath3="//元素[@attr1=value]/allText()";//獲取符合條件元素體的所有文字資料(包含子元素裡面的文字)

演示

public class DemoXpath {
    public static void main(String[] args) throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(Demo.class.getResourceAsStream("/books.xml"));
        //獲取所有的book元素
        List<Element> list = document.selectNodes("//book");
        for (Element ele: list) {
            System.out.println(ele.attributeValue("id"));
        }

       //獲取id為0002的指定book元素的子標籤name的內容
        Element ele = (Element)document.selectSingleNode("//book[@id='0002']/name");
        System.out.println(ele.getText());
    }
}

相關文章