Transcript 投影片 - 銘傳大學
了解XPATH的用途
熟悉XPATH的相關詞彙與概念
能夠撰寫XPATH搜尋指令
能夠應用XPATH進行XML資料節點搜尋
XML文件包含複雜的樹狀階層結構與內容
如何進行快速定位是XML資料處理的重要動
作
XPATH提供一套簡單又具備彈性的資料定位
概念與語法
›
›
›
›
›
XPATH樹結構
XPATH樹節點的名稱
XPATH樹節點的字串值
XPATH定位概念
XPATH定位語法
對XPATH而言,XML文件包含下列7種節點
› Root節點 (Root)
亦即 document entity, 不是根元素喔!
› 元素節點 (Element)
› 文字節點 (Text)
› 註解節點 (Comment)
› PI節點 (Procession instruction)
› 屬性節點 (Attribute)
› 命名空間節點 (Namespace)
注意:屬性節點與命名空間節點有parent節點,但不是他們的child節點
Root
/
<?xml version=“1.0” encoding=“UTF-8” ?>
<!-- XPATH Tree -->
<!-- 簡單的 XML 文件 -->
<?ap1 language = “java” ?>
<書 標題 = “JAVA 程式設計” 版本 = “1”
xmlns=“www.mcu.edu.tw” >
<範例>
<![CDATA[
JAVA 程式範例&解說
]]>
</範例>
XML 程式設計 by FHWANG
</書>
用XPATH的角度來看
Comment
XPATH Tree
Comment
簡單的 XML 文件
Processing Instruction
ap1
Language=“java”
Element
書
Namespace
www.mcu.edu.tw
Attribute
標題= “JAVA 程式設計”
Attribute
版本 = “1”
Element
範例
Text
JAVA 程式範例&解說
Text
JAVA 程式設計 by FHWANG …
擴充名稱(Expanded Name)包含兩部分:
元素節點的局部名稱就是元素名稱
屬性節點的局部名稱就是屬性名稱
PI節點的局部名稱就是target名稱
局部名稱(Local part)
名稱空間URI(Namespace URI)
一般連結到一個prefix名稱, 或預設空間
PI節點的名稱空間URI 是 null
Namespace節點的局部名稱就是prefix名稱 或是空
字串(假如是預設空間)
Namespace節點的Namespace URI 是 null
註解節點沒有局部名稱
一個節點的字串值(string values)
由其下的所有文字節點的文字串接而成
串接時,一般的文字節點(不含CDATA節點)會被
normalized (去頭尾的空白以及壓縮其他空白)
可作為節點相互比較時使用
以前面的例子而言:
JAVA 程式範例&解說XML 程式設計 by FHWANG
<書>元素的字串值?
注意:不包含屬性節點的值
JAVA 程式範例&解說XML 程式設計 by FHWANG
Root節點的字串值?
注意:不包含註解節點的值
標題屬性節點的字串值? JAVA 程式設計
一個PI節點的string values
一個PI節點的string values
› 由target後文字組成 (不含後面的 ?>)
一個Namespace節點的string values
› 由其URI組成
以前面的例子而言:
名稱空間節點的字串值?
www.mcu.edu.tw
PI節點的字串值?
language = “java”
註解節點的字串值?
XPATH Tree
節點型態
擴充名稱
字串值
根(root)
無(null)
底下所有文字節點的文字正規化後串接而成
元素(Element)
名稱空間字頭
(假如有的話)加
上元素名稱
底下所有文字節點的文字正規化後串接而成
屬性(Attribute)
名稱空間字頭
(假如有的話)加
上屬性名稱
屬性值的文字正規化後而成
文字(Text)
無(null)
文字內容正規劃後而成(CDATA的文字不會進行
正規化)
註解(Comment) 無(null)
註解的內容
在PI的target跟空白之後的文字
PI(Processing
Instruction)
PI的target
名稱空間
(Namespace)
名稱空間字頭或 名稱空間的URI
空字串(預設空
間)
同學還記得在平面空間如何定位嗎?
› X軸, Y軸定義定位的方向
› 單位定義各軸的距離
Y軸
(5, 4)
4
5
X軸
那在XPATH樹的情況下又該如何定位節點的
位置呢?
› 定位的方向
[…]
› 定位的節點型態
› 特殊條件的節點
[…]
[…]
位置路徑(location path)
› 位置段落(location step)(以 / 隔開彼此)
主軸(axis)
節點測試(node test)
述詞條件式(predicate)
› 格式:
› /主軸1::節點測試1[述詞條件式1]/step2/…
› 例:
/child::書[@標題=‘JAVA 程式設計’]/child::範例[contains(., “JAVA”)]
注意出現在第一個位置的 / 與後面的 / 意義不同!
背景節點(context node)
› 位置路徑所描述的相對節點,也就是目前段落定位的起點
表達相對於背景節點可以搜尋的節點方向與順序
›
›
›
›
›
›
›
›
›
›
›
›
›
self:: (主要型態 (principal type) 是元素)
parent::(主要型態 是元素)
child:: (若省略主軸則內定是此主軸)
ancestor::(主要型態是元素)
ancestor-or-self::(主要型態是元素)
descendant::(主要型態是元素)
descendant-or-self::(主要型態 是元素)
following:: (背景節點”後面”的節點, 但不包括子孫節點) (主要型態是元素)
following-sibling:: (背景節點”後面”的兄弟節點) (主要型態是元素)
preceding:: (背景節點”前面”的節點, 但不包括祖先節點) (主要型態是元素)
preceding-sibling:: (背景節點”前面”的兄弟節點) (主要型態是元素)
attribute:: (背景節點的屬性節點) (主要型態是屬性)
namespace:: (背景節點的命名空間節點) (主要型態是namespace)
self::
parent::
child::
ancestor::
屬性
ancestor-or-self::
descendant::
descendant-or-self::
following-sibling::
preceding-sibling::
attribute::
namespace::
Namespace
A
following::
B
C
D
preceding::
E
F
G
H
I
J
K
L
主軸選出定位的方向之後, 透過節點測試可以進一步的過濾
› *
指定所有的節點(與主軸主要型態相同型態的節點)
› node()
指定所有的節點(不管其主要型態)
› text()
指定所有的文字節點
› comment()
指定所有的comment節點
› processing-instruction()
指定所有的processing-instruction節點
› node_name
指定與node_name相同名稱的節點
attribute::
›
›
@
例子:
/descendant-or-self::node()/
›
›
//
例子:
/book//author[@name=‘fhwang’]
self::node()
›
›
/author[@name=‘fhwang’]
.
例子:
/author[ . = ‘fhwang’]
parent::node()
›
›
..
例子:
/book/author[@name=‘fhwang’]/..[@year=‘1999’]
可有可無
[predicates]
› 將一組節點集合進一步根據所給的條件進行過濾
XPATH述詞包括
› 比較大小
>, <, =, >=, <=
› 邏輯運算
and, or, not
› 各式各樣的函數
starts-with(arg1, arg2)
concat(arg1, arg2)
(search www.w3.org/TR/xpath for more detail)
last():節點集合的節點個數
position() :目前被測試節點在節點集合中的位置編號
count(xpath) :傳回xpath結果的節點個數
id(string) :傳回具有ID屬型值為string的元素節點
local-name(node-set) :傳回node-set第一個節點
的局部名稱
namesapce-uri(node-set) :傳回node-set第一個
節點的名稱空間URI
name(node-set) :傳回node-set第一個節點的擴充
名稱
/
› separates location steps
|
› 將兩個集點集合聯集起來
› 例子:
/author[@name=‘fhwang’]|/book[@year=‘1999
’]
//
› /descendant-or-self::node()/
利用XML SPY 工具,以下列的XML檔為例,進行
各式XPATH搜尋
應用範例
<?xml version="1.0" encoding="UTF-8" ?>
<!-- XPATH Tree -->
<!-- 簡單的 XML 文件 -->
<?ap1
language = "java" ?>
<書 標題 = "JAVA 程式設計" 版本 = "1"
xmlns="www.mcu.edu.tw" >
<範例>
<![CDATA[
JAVA 程式範例&解說
]]>
</範例>
XML 程式設計 by FHWANG
</書>
XPATH的用途協助XML文件節點定位
XPATH的定位概念與指令語法
撰寫XPATH搜尋指令的一些範例
應用XPATH進行XML資料節點搜尋