是否有可能在XPath 1.0中同时获取属性的值和节点内的文本?

时间:2016-03-22 13:21:49

标签: php xpath

我在这里尝试了解决方案:Getting attribute using XPath 但它给了我一个错误。

我有一些像这样的XHTML:

<a href="link.php">Click me!</a>

我以递归方式解析XML并尝试同时获取href属性(link.php)和链接文本(Click me!)。

<?php
$node = $xpath->query('string(self::a/@href) | self::a/text()', $nodes->item(0));

此代码抛出以下错误:

  

警告:DOMXPath :: query():无效类型

如果我分别执行这两项中的任何一项,它们都可以工作,但不能一起工作:

<?php
$node = $xpath->evaluate('string(self::a/@href)', $nodes->item(0));
$node = $xpath->query('self::a/text()', $nodes->item(0));

如果我使用以下内容,我会得到整个属性(href="link.php"),而不仅仅是它的值:

<?php
$node = $xpath->query('self::a/@href | self::a/text()', $nodes->item(0));

有没有办法在PHP中使用XPath 1.0同时获取两个文本值?

1 个答案:

答案 0 :(得分:1)

正如其他人所建议的那样,您可以使用concat()(并且PHP XPath支持它!请参阅下面的演示)来组合元素的属性和内容的值。

与他人的问题&#39;建议XPath可能是,从您尝试的代码(即使用self::a)判断,上下文节点($nodes->item(0))已经是<a>元素,因此a/@href相对于当前上下文节点表示返回当前元素的子元素href的{​​{1}}属性 ,这就是您没有匹配的原因。在这种情况下使用a或者只是self::a可以用来引用当前上下文节点,这是正确的:

.

<强> eval.in demo

输出

$doc = new DOMDocument();
$xml = <<<XML
<root>
<a href="link.php">Click me!</a>
</root>
XML;

$doc->loadXML($xml);
$xpath = new DOMXpath($doc);
$nodes = $xpath->query('//a');

$node = $xpath->evaluate('concat(@href, "|", .)', $nodes->item(0));
echo $node;