XPATH - 获取返回的单个值而不是数组 php
Posted
技术标签:
【中文标题】XPATH - 获取返回的单个值而不是数组 php【英文标题】:XPATH - get single value returned instead of array php 【发布时间】:2011-11-19 19:34:37 【问题描述】:我在 php 中使用 Xpath - 我知道我的查询将返回 0 或 1 个结果。
如果返回 1 个结果,我不希望它作为一个数组 - 这是现在返回的内容。我只是想要该值,而无需访问结果的 [0]
元素并转换为字符串。
这可能吗?
【问题讨论】:
【参考方案1】:您的问题表明您正在使用SimpleXML
,因为您谈论的是数组。但是很久以前,您接受了DOMDocument
的答案。在任何情况下,其他用户都会去这里寻找 SimpleXML 中的解决方案,但它的工作方式略有不同:
list($first) = $xml->xpath('//element') + array(NULL);
$first
中的元素如果不是 NULL
(对于没有元素),那么仍然是 SimpleXMLElement
类型(取决于 xpath 查询,可以是元素节点或属性节点),但是您可以只转换它在 PHP 中字符串并完成,或者您只是在 字符串上下文 中使用它,例如 echo
:
echo $first;
【讨论】:
更短的方法:$first = current($xml->xpath('//element'))
- current()
如果数组为空,则返回 null
且没有错误。【参考方案2】:
使用 'evaluate' 而不是 'query',您可以执行转换等操作。
DOMXPath::evaluate()
另外,如果您只是对多次做某事感到厌烦,只需编写一个函数来完成它......这就是函数背后的全部想法,对吧?
【讨论】:
我知道一个函数就足够了,但我正在寻找最干净的代码。如果有一个内置的 xpath 方式来获取第一个也是唯一一个节点值,那么这将比编写一个函数来完成它更可取 是的,所以评估会这样做。【参考方案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:
位置函数从表达式评估上下文返回一个等于上下文位置的数字。
示例:
$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"
请注意,在使用 // 使用位置函数查询后代时,由于表达式的计算方式,可能会产生多个结果。
【讨论】:
【参考方案4】:你可以这样写:
$string = @$array[0];
@
operator 将抑制错误,如果$array
为空,则使$string
为空。
【讨论】:
@KingCrunch:我不明白你的意思。我的代码不依赖错误。 没有理由使用@
。
@KingCrunch:我的代码与$string = is_set($array[0]) ? $array[0] : NULL
相同。但是,它更简洁。这完全在@
运算符的可接受使用范围内。【参考方案5】:
大概
if ($array[0])
$string = $array[0];
?
如果$array[0]
是一个数组,你可以将字符串重命名为new_array
if ($array[0])
$new_array = $array[0];
【讨论】:
我需要为大约 20 个值执行此操作 - 所以与其检查每个值,我想知道是否有办法从 cpath 查询中自动获取节点值 @Eric:如果你开启了 E_NOTICE,是的 @genesis:哦,获取未设置的索引只是一个通知吗? @genesis:每天学习新东西以上是关于XPATH - 获取返回的单个值而不是数组 php的主要内容,如果未能解决你的问题,请参考以下文章
如果多次单击一个选项,有没有办法只为 setOnItemClickListener 获取单个值而不是获取多个值?