我在这里尝试了解决方案:使用 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 同时获取两个文本值?
正如其他人所建议的,您可以使用concat()
(PHP XPath支持它!请参阅下面的演示)来组合属性值和元素的内容。
其他人建议的 XPath 的问题可能是,从您尝试的代码(即使用 self::a
)来看,上下文节点 ( $nodes->item(0)
) 已经是<a>
元素,因此a/@href
相对于当前上下文节点意味着返回href
子元素的属性a
当前元素,这就是您没有匹配的原因。在这种情况下,您使用self::a
是正确的,或者,或者,只是.
可用于引用当前上下文节点:
$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;
eval.in demo
输出:
link.php|Click me!