HTML :: TreeBuilder :: XPath findvalue返回值

时间:2016-07-12 05:27:38

标签: string perl xpath concatenation html-treebuilder

HTML::TreeBuilder::XPath中的findvalue函数返回xpath查询找到的任何值的串联。

为什么会这样做,以及如何将值的连接对任何人都有用?

2 个答案:

答案 0 :(得分:2)

  

为什么会这样做?

当您致电findvalue时,您正在请求单个标量值。如果有多个匹配项,则必须将它们合并为单个值以某种方式

来自HTML::TreeBuilder::XPath的文档:

  

findvalue($ path)

     

...如果路径返回NodeSet,则会自动为您调用$nodeset->xpath_to_literal(因此返回Tree :: XPathEngine :: Literal)。

来自Tree::XPathEngine::NodeSet的文档:

  

<强> xpath_to_literal()

     

返回列表中所有节点的所有字符串值的串联。

另一种方法是返回Tree :: XPathEngine :: NodeSet对象,以便用户可以自己遍历结果,但findvalues方法已经返回一个列表。

  

如何将值的连接对任何人都有用?

例如:

use strict;
use warnings 'all';
use 5.010;

use HTML::TreeBuilder::XPath;

my $content = do { local $/; <DATA> };
my $tree = HTML::TreeBuilder::XPath->new_from_content($content);

say $tree->findvalue('//p');

__DATA__
<p>HTML is just text.</p>
<p>It can still make sense without the markup.</p>

输出:

HTML is just text.It can still make sense without the markup.

通常情况下,获取匹配列表并迭代它们而不是进行哑连接更有意义,因此如果可以有多个匹配,则应使用findvalues(复数)。

答案 1 :(得分:0)

使用

( $tree->findvalues('//p') )[0] ;

代替。