我在这里尝试了解决方案: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同时获取两个文本值?
答案 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;