XPATH - 返回单个值而不是数组php

时间:2011-09-18 20:02:00

标签: php dom xpath domdocument

我在PHP中使用Xpath - 我知道我的查询将返回0或1个结果。

如果返回1个结果,我不希望它作为数组 - 这就是现在返回的结果。我只是想要值而不必访问结果的[0]元素并转换为字符串。

这可能吗?

5 个答案:

答案 0 :(得分:3)

  

如果返回1个结果,我不希望它作为数组 - 这是返回的结果。我只是想要值而不必访问结果的[0]元素并转换为字符串。

XPath's string function

可以实现
  

通过返回文档顺序中第一个节点集中节点的字符串值,将节点集转换为字符串。如果节点集为空,则返回空字符串。

DOMXPath's evaluate方法:

  

如果可能,返回类型化结果或包含与给定XPath表达式匹配的所有节点的DOMNodeList。

示例:

$dom = new DOMDocument;
$dom->loadXML('<root foo="bar"/>');
$xp = new DOMXPath($dom);
var_dump($xp->evaluate('string(/root/@foo)')); // string(3) "bar"

  

如果有一个内置的xpath方法来获取第一个和第一个节点值,那么这比写一个函数要好得多

您可以使用position function

  

position函数返回一个等于表达式求值上下文中上下文位置的数字。

示例:

$dom = new DOMDocument;
$dom->loadXML('<root><foo xml:id="f1"/><foo xml:id="f2"/></root>');
$xp = new DOMXPath($dom);
var_dump($xp->evaluate('string(/root/foo[position() = 1]/@xml:id)')); // string(2) "f1"

abbreviated syntax

$dom = new DOMDocument;
$dom->loadXML('<root><foo xml:id="f1"/><foo xml:id="f2"/></root>');
$xp = new DOMXPath($dom);
var_dump($xp->evaluate('string(/root/foo[1]/@xml:id)')); // string(2) "f1"

请注意,使用position函数查询后代时,由于表达式的计算方式,可能会产生多个结果。

答案 1 :(得分:1)

使用'评估'代替'query',您可以执行诸如投射之类的操作。

另外,如果你只是厌倦了做很多次的事情,那就写一个能做到这一点的函数......这就是函数背后的整个想法吧?

答案 2 :(得分:0)

可能

if ($array[0]){
    $string = $array[0];
}

如果$array[0]是一个数组,则可以将字符串重命名为new_array

if ($array[0]){
    $new_array  = $array[0];
}

答案 3 :(得分:0)

您的问题表明您正在使用SimpleXML,因为您谈论的是数组。但是很久以前你接受了回答DOMDocument。在任何情况下,其他用户都在这里寻找 SimpleXML 中的解决方案,它的工作方式略有不同:

list($first) = $xml->xpath('//element') + array(NULL);

$first中的元素(如果不是NULL(对于没有元素)则仍然是SimpleXMLElement类型(元素节点或属性节点,具体取决于xpath查询),但是你可以在PHP中将它转换为字符串并完成,或者只是在字符串上下文中使用它,就像 echo 一样:

echo $first;

答案 4 :(得分:-2)

你最简单的写作就是这样:

$string = @$array[0];

@ operator会阻止错误,如果$string为空,则$array为空。