2012-07-29 149 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