1

我有以下 SimpleXMLElement 对象http://pastebin.com/qEP0UUPJ

我可以使用 xpath 查询它,$xaugbp = $xml->xpath("/query/results/rate");但这只会缩小搜索范围:

http://pastebin.com/Xwezx4bZ

我希望访问以下对象:

[0] => SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [id] => XAUGBP
            )

        [Name] => XAU to GBP
        [Rate] => 1030.5784
        [Date] => 7/27/2012
        [Time] => 5:55pm
        [Ask] => 1027.5662
        [Bid] => 1033.5896

我可以使用

$ob = $xmlObject->xpath("//query/results/rate[contains(@id, 'XAUGBP')]");

我可以通过使用“询问”

$ob = $xmlObject->xpath("//query/results/rate[contains(@id, 'XAUGBP')]/Ask");

但是我如何把那个对象变成一个变量。例如,以便我可以对其进行计算?

xpath 是唯一的方法吗?有没有更好/更有效/更快的方法?是否可以将其转换为关联数组以便于访问?

4

2 回答 2

2

前言

在您做任何事情之前,(重新)熟悉一下 SimpleXML 独特的做事方式。最好的起点是SimpleXML 基本使用手册页。


下面的示例向您展示:

  • <rate>根据属性的值获取单个元素对象,以及如何显示它。
  • 循环遍历所有<rate>元素并显示它们的值。

基本示例代码

$query = simplexml_load_file('…');

// Get a <rate> element by its id attribute
$rates = $query->xpath('results/rate[@id = "XAUGBP"]');
$rate  = $rates[0];
echo "$rate->Name was at $rate->Rate at $rate->Time on $rate->Date\n";

echo "-----\n";

// or, loop over all of the <rate> elements
foreach ($query->results->rate as $rate) {
    echo "$rate->Name was at $rate->Rate at $rate->Time on $rate->Date\n";
}

上面的示例输出:

XAU to GBP was at 1030.5784 at 5:55pm on 7/27/2012
-----
XAU to GBP was at 1030.5784 at 5:55pm on 7/27/2012
XAG to GBPZ 999 N was at 17.4502 at 5:55pm on 7/27/2012
XPT to GBPZ 999 was at 893.3414 at 5:55pm on 7/27/2012
XPD to GBP1 UZ was at 362.652 at 5:55pm on 7/27/2012

见这个在线运行的例子


XML 到数组

我看到这个问题一次又一次地被问到。与其把对象树变成一些“友好的”数组,不如SimpleXMLElement花时间学习如何使用 SimpleXML:一旦你做到了,就不需要采取将对象变成数组的中间步骤来使用. 上面提到的“基本用法”页面应该可以帮助您入门,但要了解的关键点是:

  1. 子节点使用属性语法:$parent->child
  2. 属性使用数组样式的语法:$element["attr_name"]
  3. 在需要时将对象转换为友好类型:(string) $element->child
于 2012-07-29T17:17:33.497 回答
1

XPath 查询应该是"//query/results/rate[contains(@id, 'XAUGBP')]"

于 2012-07-29T16:33:21.400 回答