我在PHP中使用Xpath -我知道我的查询将返回0或1的结果。
如果返回1个结果,我不希望它作为一个数组-这是现在返回的。我只是想要这个值,而不需要访问结果的[0]
元素并将其转换为字符串。
这可能吗?
如果返回1的结果,我不希望它作为一个数组-这是什么返回。我只是想要一个值,而不需要访问结果的[0]元素并强制转换为字符串。
这可以通过XPath的string
函数
通过返回节点集中按文档顺序排在前面的节点的字符串值,将节点集转换为字符串。如果节点集为空,则返回空字符串。
和DOMXPath的evaluate
方法:
返回一个类型化的结果(如果可能的话)或一个DOMNodeList,其中包含与给定XPath表达式匹配的所有节点。
例子:
$dom = new DOMDocument;
$dom->loadXML('<root foo="bar"/>');
$xp = new DOMXPath($dom);
var_dump($xp->evaluate('string(/root/@foo)')); // string(3) "bar"
如果有一个内置的xpath方法来抓取第一个且仅是第一个节点值,那么这将比编写函数更可取
您可以使用position
函数:
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"
或缩写语法
$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函数查询//的后代时,由于表达式的求值方式可能会产生多个结果。
使用'evaluate'而不是'query',您可以执行诸如强制转换之类的操作。
-
DOMXPath::evaluate()
同样,如果你只是讨厌做很多次的事情,那就写一个函数来完成它…这就是函数背后的全部思想,对吧?
可能
if ($array[0]){
$string = $array[0];
}
?
如果$array[0]
是一个数组,可以将string重命名为new_array
if ($array[0]){
$new_array = $array[0];
}
您的问题表明您正在使用SimpleXML
,因为您谈论数组。然而,很久以前你接受了一个答案,给出了DOMDocument
的答案。在任何情况下,其他用户到这里寻找解决方案在SimpleXML它的工作方式有点不同:
list($first) = $xml->xpath('//element') + array(NULL);
$first
中的元素如果不是NULL
(对于没有元素),那么仍然将是SimpleXMLElement
类型(根据xpath查询,可以是元素节点或属性节点),但是您可以将其在PHP中转换为字符串并完成,或者您只需在字符串上下文中使用它,就像 echo
:
echo $first;
最简单的写法是:
$string = @$array[0];
@
运算符将抑制错误,如果$array
为空,则$string
为空。