2012-07-29 103 views
1

我有以下SimpleXMLElement对象http://pastebin.com/qEP0UUPJ访问的SimpleXMLElement对象值

我可以使用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是这样做的唯一方法吗?有更好/更有效/更快捷的方法吗?是否有可能将其转换为关联数组以便于访问?

+0

未提供源XML文档。那么这怎么可能是一个“XPath问题”? – 2012-07-29 16:58:34

+0

API正在将数据作为XML文档返回。有了这些数据,我创建了SimpleXMLElement对象并使用了XPATH来缩小我的查询范围。我现在需要的只是获取实际的数据值。 – Gravy 2012-07-29 17:05:30

+0

“与数据”...与*什么*数据?您尚未显示源XML文档。如果您只需要获取某个属性的值,那么这真的不是一个XPath问题。 – 2012-07-29 17:15:59

回答

2

前言

在你做任何事情,(重新)熟悉的SimpleXML的做事奇特的方式。最好的地方是SimpleXML basic usage手册页。


下面的例子显示了:

  • 获取基于属性的值的单个<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 

See this example running online


XML到阵列

我一次又一次地看到这个问题。与其将SimpleXMLElement对象的树变成一些“友好”的数组,不如花时间学习如何使用SimpleXML:一旦完成了这些,就不需要采取将对象转换为数组来工作的中间步骤用。上面提到的“基本使用”页面应该让你去,但关键点就知道是:

  1. 子节点使用属性语法:$parent->child
  2. 属性使用数组风格的语法:$element["attr_name"]
  3. 演员对象在需要时转换为友好类型:(string) $element->child
1

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

+0

谢谢。但是,如何将该对象转换为关联数组,以便我可以实际执行相关操作?或者,我该如何将'// query/results/rate [contains(@id,'XAUGBP')]/Ask'从一个对象转换为一个值? – Gravy 2012-07-29 16:40:25

+0

通过使用SimpleXMLElement :: __ toString,您应该可以获取字符串值// query/results/rate [contains(@id,'XAUGBP')]/Ask,但将SimpleXML转换为关联数组似乎相当多余。 – 2012-07-29 17:16:11