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

发布于 2024-12-05 03:24:50 字数 148 浏览 0 评论 0原文

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

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

这可能吗?

I am using Xpath in PHP - I know that my query will return either 0 or 1 results.

If 1 result is returned I do not want it as an array - which is what is returned right now. I simply want the value without having to access the [0] element of the result and cast to a string.

Is this possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

等待我真够勒 2024-12-12 03:24:50

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

这可以通过 XPath 的 string 函数

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

DOMXPath 的 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 方式来获取第一个且仅第一个节点值,那么这比编写一个函数来执行此操作要好得多

您可以使用 位置函数

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

示例:

$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"

请注意当使用 // 查询后代时,由于表达式的求值方式,使用位置函数可能会产生多个结果。

If 1 result is returned I dont want it as an array - which is what is returned. I simply want the value without having to access the [0] element of the result and cast to a string.

That is possible with XPath's string function

A node-set is converted to a string by returning the string-value of the node in the node-set that is first in document order. If the node-set is empty, an empty string is returned.

and DOMXPath's evaluate method:

Returns a typed result if possible or a DOMNodeList containing all nodes matching the given XPath expression.

Example:

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

If there was a built in xpath way of grabbing the first and only the first node value then that would be much more preferable over writing a function to do it

You can use the position function:

The position function returns a number equal to the context position from the expression evaluation context.

Example:

$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"

or the 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"

Note that when querying for descendants with // using the position function might yield multiple result due to the way the expression is evaluated.

零度° 2024-12-12 03:24:50

使用'evaluate'而不是'query',您可以执行诸如转换之类的操作。

另外,如果您只是对这样做感到恼火很多时候,只需编写一个函数来完成它......这就是函数背后的整个思想,对吧?

Using 'evaluate' instead of 'query', you can do things like casting.

Also, if you're just annoyed with doing stuff a lot of times, just write a function that does it ... that is the whole idea behind functions, right?

九八野马 2024-12-12 03:24:50

大概

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

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

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

probably

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

?

if $array[0] is an array, you can rename string to new_array

if ($array[0]){
    $new_array  = $array[0];
}
吲‖鸣 2024-12-12 03:24:50

您的问题表明您正在使用 SimpleXML 因为您谈论的是数组。然而很久以前,您接受了一个用 DOMDocument 给出答案的答案。无论如何,其他用户都去这里寻找 SimpleXML 中的解决方案,它的工作方式略有不同:

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

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

echo $first;

Your question suggests that you are using SimpleXML because you talk about an array. However long-time ago you accepted an answer giving an answer with DOMDocument. In any case other users go here looking for a solution in SimpleXML it works a little differently:

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

The element in $first if not NULL (for no elements) then still will be of type SimpleXMLElement (either an element node or an attribute node depending on the xpath query), however you can just cast it to string in PHP and done or you just use it in string context, like with echo:

echo $first;
也只是曾经 2024-12-12 03:24:50

您可以像这样最简单地编写它:

$string = @$array[0];

@ 运算符 将抑制错误,如果 $array 为空,则使 $string 为空。

You can write it most simply like this:

$string = @$array[0];

The @ operator will suppress errors, making $string null if $array is empty.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文