您写道您想要以下查询的结果集的长度:
$queryResult = $xpathvar->query('//item/title');
我假设$xpathvar
这是类型DOMXPath http://php.net/manual/en/class.domxpath.php。如果是的话,它有一个此处描述的长度属性 https://stackoverflow.com/questions/1121437/finding-number-of-nodes-in-php-dom-xpath。而不是使用foreach
,只需使用:
$length = $xpathvar->query('//item/title')->length;
现在我想选择文本节点值//channel/item/title
你可以用表达式得到//channel/item/title/text()
.
和 href 值//channel/item/description/table/tr/td[1]/a[1]
(带有文本节点value = "[link]"
)
您在这里的表达式选择任何tr
, 首先td
在此之下,然后是第一个a
。但第一个a
没有一个值"[link]"
在你的来源中。不过,如果您想要这样,您可以使用:
//channel/item/description/table/tr/td[1]/a[1]/@href
但看起来你更想要:
//channel/item/description/table/tr/td/a[. = "[link]"][1]/@href
找到第一个a
树中具有以下值(文本节点)的元素"[link]"
.
在上面的第二种情况下,我正在寻找第二种情况的值a
(带有文本节点value = "[link]"
),第 2 内td
inside tr
, table
, description
, item
, channel
.
不确定这是一个单独的问题还是旨在解释前一个问题。无论如何,答案与前一个相同,除非您明确想要搜索第二个a
等(即按位置搜索),在这种情况下您可以使用数字谓词。
注意:大部分表达式都是以//expr
,这本质上意味着:在任意深度搜索整个树以查找表达式expr
。这可能很昂贵,如果您需要的只是一个知道起点或表达式的(相对)根节点,那么使用直接路径更好,而且性能更高。对于你的情况,你可以替换//channel
for /*/channel
(因为它是根元素下的第一个)。