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的主要内容,如果未能解决你的问题,请参考以下文章

PHP比较两个数组并获得匹配的值而不是差异

如果多次单击一个选项,有没有办法只为 setOnItemClickListener 获取单个值而不是获取多个值?

在尝试为 neo4j db 仅返回单个对象而不是 graphql 中的数组时获取 null

二分查找函数总是返回 -1 值而不是索引

想要获取像实时数据库这样的火库

c#连接mysql数据库以后 怎么的获取select语句返回的值而不是影响的条数 需要用啥样的代码写