【发布时间】:2011-11-19 19:34:37
【问题描述】:
我在 PHP 中使用 Xpath - 我知道我的查询将返回 0 或 1 个结果。
如果返回 1 个结果,我不希望它作为一个数组 - 这是现在返回的内容。我只是想要该值,而无需访问结果的 [0] 元素并转换为字符串。
这可能吗?
【问题讨论】:
标签: php dom xpath domdocument
我在 PHP 中使用 Xpath - 我知道我的查询将返回 0 或 1 个结果。
如果返回 1 个结果,我不希望它作为一个数组 - 这是现在返回的内容。我只是想要该值,而无需访问结果的 [0] 元素并转换为字符串。
这可能吗?
【问题讨论】:
标签: php dom xpath domdocument
您的问题表明您正在使用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 且没有错误。
使用 'evaluate' 而不是 'query',您可以执行转换等操作。
另外,如果您只是对多次做某事感到厌烦,只需编写一个函数来完成它......这就是函数背后的全部想法,对吧?
【讨论】:
如果返回 1 个结果,我不希望它作为一个数组 - 这就是返回的内容。我只是想要该值,而无需访问结果的 [0] 元素并转换为字符串。
XPath's string function 可以做到这一点
通过返回节点集中文档顺序中第一个节点的字符串值,将节点集转换为字符串。如果节点集为空,则返回一个空字符串。
如果可能,返回一个类型化的结果或一个包含所有与给定 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"
$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"
请注意,在使用 // 使用位置函数查询后代时,由于表达式的计算方式,可能会产生多个结果。
【讨论】:
【讨论】:
@。
$string = is_set($array[0]) ? $array[0] : NULL 相同。但是,它更简洁。这完全在@ 运算符的可接受使用范围内。
大概
if ($array[0]){
$string = $array[0];
}
?
如果$array[0]是一个数组,你可以将字符串重命名为new_array
if ($array[0]){
$new_array = $array[0];
}
【讨论】: