單元4-2: XPATH 範例 王豐緒 銘傳大學資工系
單元目標 以更多的範例幫助同學熟悉XPATH的語法與應用
解釋下列的XPATH句子的意義 / //author[degree] //@date[. = ’06/01/2008’] //book[author/@birthday = @date] //book[author]/title *[@date] book/*/amount */* */@* //title [. = “Harry Potter"] //book[author and title] author[degree and not (publication)] author [(last() - 4) <= position() and position() <= last() ]
XPATH 函式呼叫的範例 count(//book) //book[contains(title, ‘Potter’) ] //book[@year = substring-before(“2008/04/01","/") ] //author[@birthday = substring-after(“2008/04/01","/") ] //book[normalize-space(title)=‘Harry Potter’] sum(//book/amount) avg(//book/amount) name(/book/*[2]) /booklist/book/namespace-uri() /booklist/*[local-name()="book"] /booklist/*[name()="book"]
比較範例的不同(1/4) 範例 說明 1-1 /booklist/book 1-2 booklist/book 2-1 /booklist/book/title 2-2 //book/title 2-1 位於第3層的title (/booklist/book/title) 2-2 位於任意層的title (book/title) 3-1 /booklist/book/@author 3-2 //book/@author 3-3 //@author 3-1 第2層的book的author屬性 (/booklist/book) 3-2 任意層的book的author屬性 3-3 任意元素的author屬性 4-1 book[author/degree] 4-2 book[author][degree] 4-1目前節點下的book元素, 且其下有author/degree 4-2目前節點下的book元素, 且其下有author 和degree (同一層)
比較範例的不同(2/4) 比較下列的不同: 書/範例[1] (書/範例)[1] 書[1]/範例[1] Sample2 XML 資料 書 範例
比較範例的不同(3/4) 比較下列的不同: book my:book my:book/author my:book/my:author my:book/@name my:book/@my:name Note: 屬性節點跟元素節點一樣都可以有名稱空間的字頭!
比較範例的不同(4/4) //book[author/first-name="Bob"][position()=1] //book[author/first-name="Bob" and position() = 1] xml //book [author/first-name=“Bob”] … … [1] . (1) [author/first-name=“Bob” and position()=1] xml //book … . (2) (一定是文件第一個book)
判斷範例的錯誤 下列的XPATH句子錯誤在哪裡? //book[year >2000] and [year <2008] //book/@author/date //@author[1] //@author[2] 正確的XPATH句子: //book[year >2000 and year <2008] 屬性節點下不會有子節點,所以會找不到東西 屬性節點沒有順序,所以//@author[1] =//@author, 會找出所有author屬性節點 屬性節點沒有順序//@author[2]會找不到東西
應用範例一: 問題:要找出第一個具有author屬性的 <範例>標記的author節點,其XPATH句子該如何寫? Sample3 <?xml version="1.0" encoding="UTF-8" ?> <書 標題 = "JAVA 程式設計" 版本 = "1" xmlns="www.mcu.edu.tw" > <範例 > <![CDATA[ JAVA 程式範例&解說1 ]]> </範例> <範例 author="fhwang"> JAVA 程式範例&解說2 <範例 author="Liu"> JAVA 程式範例&解說3 XML 程式設計 by FHWANG </書> 問題:要找出第一個具有author屬性的 <範例>標記的author節點,其XPATH句子該如何寫? A1://*/@author[1] A2://*[@author and position()=1]/@author A3://*[@author ][position()=1]/@author A4://*[@author][1]/@author A3 and A4
XPATH有關節點字串值的處理(I) 請問://name[. = ‘Wang’] 會找到下列哪些節點? <name>Wang</name> <name> FH Wang</name> <name><last-name>Wang</last-name></name> <name> <first-name>FH</first-name> <last-name>Wang</last-name> </name>
XPATH有關節點字串值的處理(II) 請問: //name[. = ‘FH Wang’] 會找到下列哪些節點? <name>Wang</name> <name>FH Wang</name> <name><last-name>Wang</last-name></name> <name> <first-name>FH</first-name> <last-name>Wang</last-name> </name> Note: XPATH串接文字時不會自動加空格!
比較運算子 Operator Description = Equality (for 數字 and 文字) != Inequality (for 數字 and 文字) < Less than (for 數字 only) <= Less than or equal (for 數字 only) > Greater than (for 數字 only) >= Greater than or equal (for 數字 only)
文字比較 字串比大小要用 compare(X, Y), 傳回: -1 if X < Y, 0 if X = Y, 1 if X > Y 例如:要找比 ‘2008/01/01’早的書 //book[ compare(@date, ‘2008/01/01’) = -1 ]
Union 說明下列XPATH的意義: /bookstore/book | /bookstore/magazine book | book/author ( (book | magazine)/author/first-name) | (book | magazine)/author/last-name | (book | magazine)/author/degree) ) 注意: XPATH句子內的Union只能出現在第一個step, 所以下列是錯誤的XPATH (book | magazine)/author/(first-name | last-name | degree)
XPATH 運算子優先順序(1.0) Operation Type XPath Operators Grouping ( ) Filter [ ] Unary minus - Multiplication *, div, mod Addition +, - Relational (Comparison) = != < <= > >= Union | Negation not Conjunction and Disjunction or (XPATH 1.0)
單元複習 解讀不同XPATH句子並判斷其差異 XPATH函式的應用 XPATH有關節點字串值的處理 XPATH運算子 Union運算子 文字數字比較 compare()函式 Union運算子 運算子的優先順序