筆記:XML-解析文檔-XPath 定位信息

来源:http://www.cnblogs.com/li3807/archive/2017/05/17/6870073.html
-Advertisement-
Play Games

如果需要定位某個XML文檔中的一段特定信息,那麼通過遍歷DOM 樹的眾多節點來進行行查找顯得有些麻煩,XPath語言使得訪問樹節點變得很容易,例如,下麵的XML文檔結構: Helv... ...


如果需要定位某個XML文檔中的一段特定信息,那麼通過遍歷DOM 樹的眾多節點來進行行查找顯得有些麻煩,XPath語言使得訪問樹節點變得很容易,例如,下麵的XML文檔結構:

<?xml version="1.0" encoding="utf-8" ?>

<root>

        <title>

                <font enabled="false">

                        <!-- 字體名稱 -->

                        <name>Helvetica</name>

                        <size>36</size>

                </font>

                <data>

                        <![CDATA[xml document root node <root.../>]]>

                </data>

        </title>

</root>

可以通過對XPath表達式 /root/title/font/size 求值來得到 size 節點的值,示例代碼如下:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Path xmlPath = Paths.get("E:\\IDEA Workspace\\exampleiostream\\src\\main\\java\\org\\drsoft\\examples\\xml", "appParse.xml");

InputStream xmlStream = Files.newInputStream(xmlPath, StandardOpenOption.READ);

Document xmlDocument = builder.parse(xmlStream);

XPathFactory xPathFactory = XPathFactory.newInstance();

XPath xPath = xPathFactory.newXPath();

String xpathResult = xPath.evaluate("/root/title/font/size", xmlDocument);

System.out.println("XPath /root/title/font/size value " + xpathResult);

XPath 表達式還提供了更豐富的語法來實現對XML 文檔的篩選節點,節點是通過沿著路徑 (path) 或者步 (steps) 來選取的:

  • 選取節點:XPath 使用路徑表達式在 XML 文檔中選取節點。節點是通過沿著路徑或者 step 來選取的

    下麵列出了最有用的路徑表達式:

表達式

描述

示例表達式

結果

nodename

選取此節點的所有子節點。

root

選取 root 元素的節點

/

從根節點選取。

/root

選取根元素 root。

註釋:假如路徑起始於正斜杠( / ),則此路徑始終代表到某元素的絕對路徑

//

從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。

//title

選取所有 title 子元素,而不管它們在文檔中的位置

.

選取當前節點。

  

  

..

選取當前節點的父節點。

  

  

@

選取屬性。

//@enabled

選取名為 enabled 的所有屬性

  

  

  

  

示例代碼如下:

NodeList list = (NodeList) xPath.evaluate("root", xmlDocument, XPathConstants.NODESET);

for (int i = 0; i < list.getLength(); i++) {

        System.out.println("XPath root Node " + list.item(i).getNodeName());

}

System.out.println("----------------------------------------");

list = (NodeList) xPath.evaluate("//title", xmlDocument, XPathConstants.NODESET);

for (int i = 0; i < list.getLength(); i++) {

        System.out.println("XPath //title Node " + list.item(i).getNodeName());

}

System.out.println("----------------------------------------");

list = (NodeList) xPath.evaluate("//@enabled", xmlDocument, XPathConstants.NODESET);

for (int i = 0; i < list.getLength(); i++) {

        System.out.println("XPath //@enabled Node " + list.item(i).getNodeName() + " Value " + list.item(i).getNodeValue());

}

System.out.println("----------------------------------------");

  • 謂語:謂語用來查找某個特定的節點或者包含某個指定的值的節點,謂語被嵌在方括弧中。

路徑表達式

結果

/root/title[1]

選取屬於 root 子元素的第一個 title 元素。

/root/title[last()]

選取屬於 root 子元素的最後一個 title 元素。

/root/title[last()-1]

選取屬於 root 子元素的倒數第二個 title 元素。

/root/title[position()<3]

選取最前面的兩個屬於 root 元素的子元素的 title 元素。

//font[@enabled]

選取所有擁有名為 enabled 的屬性的 font元素。

//font[@enabled='true']

選取所有 font 元素,且這些元素擁有值為 true 的 enabled 屬性。

/root/title/font[size>35]

選取 root 元素下的 title 的所有 font 元素,且其中的 size 元素的值須大於 35。

/root/title/font[size>35]/name

選取 root 元素下的 title 的font 元素下的所有 name 元素,且其中的 size 元素的值須大於 35

示例代碼如下:

list = (NodeList) xPath.evaluate("/root/title/font[size>10]", xmlDocument, XPathConstants.NODESET);

for (int i = 0; i < list.getLength(); i++) {

          System.out.println("XPath /root/title/font[size>10] Node " + list.item(i).getNodeName()

+ " Value " + list.item(i).getNodeValue());

}

System.out.println("----------------------------------------");

list = (NodeList) xPath.evaluate("/root/title/font[size>10]/name", xmlDocument, XPathConstants.NODESET);

for (int i = 0; i < list.getLength(); i++) {

          System.out.println("XPath /root/title/font[size>10]/name Node " + list.item(i).getNodeName()

+ " Value " + list.item(i).getNodeValue());

}

System.out.println("----------------------------------------");

  • 運算符:

運算符

描述

實例

返回值

|

計算兩個節點集

//book | //cd

返回所有擁有 book 和 cd 元素的節點集

+

加法

6 + 4

10

-

減法

6 - 4

2

*

乘法

6 * 4

24

div

除法

8 div 4

2

=

等於

price=9.80

如果 price 是 9.80,則返回 true。

如果 price 是 9.90,則返回 false。

!=

不等於

price!=9.80

如果 price 是 9.90,則返回 true。

如果 price 是 9.80,則返回 false。

<

小於

price<9.80

如果 price 是 9.00,則返回 true。

如果 price 是 9.90,則返回 false。

<=

小於或等於

price<=9.80

如果 price 是 9.00,則返回 true。

如果 price 是 9.90,則返回 false。

>

大於

price>9.80

如果 price 是 9.90,則返回 true。

如果 price 是 9.80,則返回 false。

>=

大於或等於

price>=9.80

如果 price 是 9.90,則返回 true。

如果 price 是 9.70,則返回 false。

or

price=9.80 or price=9.70

如果 price 是 9.80,則返回 true。

如果 price 是 9.50,則返回 false。

and

price>9.00 and price<9.90

如果 price 是 9.80,則返回 true。

如果 price 是 8.50,則返回 false。

mod

計算除法的餘數

5 mod 2

1

  • 函數:

名稱

說明

上下文函數

  

position()

返回當前正在被處理的節點的 index 位置。

例子://book[position()<=3]

結果:選擇前三個 book 元素

last()

返回在被處理的節點列表中的項目數目。

例子://book[last()]

結果:選擇最後一個 book 元素

合計函數

  

count

返回節點的數量

sum

返回指定節點集中每個節點的數值的總和

字元串函數

  

string

返回參數的字元串值。參數可以是數字、邏輯值或節點集。

例子:string(314)

結果:"314"

concat

返回字元串的拼接。

例子:concat('XPath ','is ','FUN!')

結果:'XPath is FUN!'

substring

返回從 start 位置開始的指定長度的子字元串。第一個字元的下標是 1。如果省略 len 參數,則返回從位置 start 到字元串末尾的子字元串。

例子:substring('Beatles',1,4)

結果:'Beat'

例子:substring('Beatles',2)

結果:'eatles'

string-length

返回指定字元串的長度。如果沒有 string 參數,則返回當前節點的字元串值的長度。

例子:string-length('Beatles')

結果:7

其他函數

  

number

返回參數的數值。參數可以是布爾值、字元串或節點集。

例子:number('100')

結果:100

round

把 num 參數舍入為最接近的整數。

例子:round(3.14)

結果:3

例子:round(3.56)

結果:4

floor

返回不大於 num 參數的最大整數。

例子:floor(3.14)

結果:3

ceiling

返回大於 num 參數的最小整數。

例子:ceiling(3.14)

結果:4

示例代碼如下:

xpathResult = xPath.evaluate("count(//title)", xmlDocument);

System.out.println("XPath expression count(//title) value=" + xpathResult);

xpathResult = xPath.evaluate("sum(//size/text())", xmlDocument);

System.out.println("XPath expression sum(//size/text()) value=" + xpathResult);

xpathResult = xPath.evaluate("//title[

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 分享一個VBA的一個把一個sheet中的多個table(每一個table又hyperlinks),分配在不同的sheet中的方法,做這個真的也是耗費了不少的腦細胞。 Option Explicit ’這個是一個好習慣 ’第一種方法,通過currentregion來判斷區域,但是不是很保險 Sub G ...
  • 本節探討Java中的動態代理,介紹其用法和基本實現原理,利用它實現簡單的AOP框架 ...
  • 一、從石油工程師到IT入門 本人是石油工程師,長期在中東兩伊邊境油田工作,常年漂泊在外。眾所周知,石油行業環境艱苦,長石油的地方不是在鳥不拉屎的沙漠,深山老林,就是在驚濤駭浪的海上平臺。記得第一次到伊拉克邊境的時候,里三層,外三層全是雇佣軍,警察和士兵把手,連井場都不能隨處亂走,因為聽說兩伊戰爭的時 ...
  • https://msdn.microsoft.com/en-us/library/d4cfawwc.aspx For the latest documentation on Visual Studio 2017, see Visual Studio 2017 Documentation. Resou ...
  • 最近對 newlib 中的啟動代碼 crt0 產生了興趣,於是就分析了下其代碼。crt0 的源碼位於 libgloss/arm/crt0.S,為了相容各種 ARM 架構,crt0.S 中有大量的條件判斷巨集定義,對於只關心 ARMv7e-M 的我來說很是痛苦。剛好手上有個基於 STM32F412 的 ...
  • 作業 1: 員工信息表程式,實現增刪改查操作 可進行模糊查詢,語法至少支持下麵3種: select name,age from staff_table where age > 22 select * from staff_table where dept = "IT" select * from s ...
  • 第一次寫博客這玩意,不太會,算了,直接粘代碼吧。 ...
  • 1、FutureTask 2、CyclicBarrier 3、CountDownLatch 4、Semaphore ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...