码迷,mamicode.com
首页 > 其他好文 > 详细

XPath中的text()和string()区别(转)

时间:2017-11-25 18:28:00      阅读:540      评论:0      收藏:0      [点我收藏+]

标签:ref   xpath语法   类型   举例   数学运算   node   type   logs   总结   

原文地址 : http://blog.csdn.net/jiangchao858/article/details/63314426

本质区别
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例子:
<book>
    <author>Tom <em>John</em> cat</author>
    <pricing>
        <price>20</price>
        <discount>0.8</discount>
    </pricing>
</book>

text()
经常在XPath表达式的最后看到text(),它仅仅返回所指元素的文本内容。
    let $x := book/author/text()
    return $x
返回的结果是Tom cat,其中的John不属于author直接的节点内容。


string()
string()函数会得到所指元素的所有节点文本内容,这些文本讲会被拼接成一个字符串。
    let $x := book/author/string()
    return $x
返回的内容是”Tom John cat”


data()
大多数时候,data()函数和string()函数通用,而且不建议经常使用data()函数,有数据表明,该函数会影响XPath的性能。
    let $x := book/pricing/string()
    return $x
返回的是200.8


    let $x := book/pricing/data()
    return $x
这样将返回分开的200.8,他们的类型并不是字符串而是xs:anyAtomicType,于是就可以使用数学函数做一定操作。


let $x := book/pricing/price/data()
let $y := book/pricing/discount/data()
return $x*$y
比如上面这个例子,就只能使用data(),不能使用text()或 string(),因为XPath不支持字符串做数学运算。


总结
text()不是函数,XML结构的细微变化,可能会使得结果与预期不符,应该尽量少用,data()作为特殊用途的函数,可能会出现性能问题,如无特殊需要尽量不用,string()函数可以满足大部分的需求。



scrapy:xpath string(.)非常注意问题:

text = selector.xpath(‘//div[@span="ct"]/string(.)‘).extract_first()
#写成这样是xpath语法错误,而把string(.)单独提出来就可以过
data = selector.xpath(‘//div[@span="ct"]‘)
text = data.xpath(‘string(.)‘).extract_first()
或者
data  = selector.xpath(‘//div[@span="ct"]‘).xpath(‘string(.)‘).extract_first()

XPath中的text()和string()区别(转)

标签:ref   xpath语法   类型   举例   数学运算   node   type   logs   总结   

原文地址:http://www.cnblogs.com/nyist-xsk/p/7895877.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!