Xpath中text(),string(),data()的區別


摘要: 在XPath中,經常使用text()和string(),而我一般都是想到哪個用哪個,究竟他們之間有什么不同,沒有在意過。

本質區別

text()是一個node test,而string()是一個函數,data()是一個函數且可以保留數據類型。此外,還有點號(.)表示當前節點。

使用要點

XML例子: 
<book><author>Tom John</author></book>

用例 舉例
text() book/author/text()
string() book/author/string()
data() book/author/data()
. book/author/.

特殊用例

XML例子:

  1.  
    <book>
  2.  
    <author>Tom <em>John</em> cat</author>
  3.  
    <pricing>
  4.  
    <price>20</price>
  5.  
    <discount>0.8</discount>
  6.  
    </pricing>
  7.  
    </book>

text()

經常在XPath表達式的最后看到text(),它僅僅返回所指元素的文本內容。

  1.  
    let $x := book/author/text()
  2.  
    return $x

返回的結果是Tom cat,其中的John不屬於author直接的節點內容。

string()

string()函數會得到所指元素的所有節點文本內容,這些文本講會被拼接成一個字符串。

  1.  
    let $x := book/author/string()
  2.  
    return $x

返回的內容是”Tom John cat”

data()

大多數時候,data()函數和string()函數通用,而且不建議經常使用data()函數,有數據表明,該函數會影響XPath的性能。

  1.  
    let $x := book/pricing/string()
  2.  
    return $x

返回的是200.8

  1.  
    let $x := book/pricing/data()
  2.  
    return $x

這樣將返回分開的20和0.8,他們的類型並不是字符串而是xs:anyAtomicType,於是就可以使用數學函數做一定操作。

  1.  
    let $x := book/pricing/price/data()
  2.  
    let $y := book/pricing/discount/data()
  3.  
    return $x*$y

比如上面這個例子,就只能使用data(),不能使用text()或 string(),因為XPath不支持字符串做數學運算。

總結

text()不是函數,XML結構的細微變化,可能會使得結果與預期不符,應該盡量少用,data()作為特殊用途的函數,可能會出現性能問題,如無特殊需要盡量不用,string()函數可以滿足大部分的需求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM