2011-06-13 129 views
1

我一直在用磚頭撞牆,所以非常感謝您的幫助。我第一次使用xpath,讓它能夠完成我所需要的大部分工作,而且沒有任何問題。使用Xpath從命名空間獲取XML的數據

下面是一個例子片段:

$urlw = "http://www.wahanda.com/rss/mobdeal.xml"; 
$wf = gzopen ($urlw, 'r'); 
$wxml = new SimpleXMLElement (fread ($wf, 1000000)); 

foreach($wxml->xpath ('/rss/channel/item') as $entry) 
{ 
    $price = $entry->price; 
    echo $price . "<br/>"; 
} 

我的問題是我目前使用的飼料有命名空間聲明,以「價格」節點其實是在「W:價格」。我想使用的一些節點前綴爲「w:」,而其他節點則不是。因此,我的代碼無法獲取前綴節點的內容。有人可以告訴我我如何解決這個問題嗎?從閱讀我添加以下內容:

$wxml->registerXPathNamespace('w', 'http://www.wahanda.com/ns/1.0'); 

但仍然不確定我需要從這裏做什麼。

非常感謝您的幫助。

+0

一旦你註冊的前綴,你可以[查詢與前綴節點(http://stackoverflow.com/search?q=registerXPathNamespace+php),例如''w:foo/w:bar'與['xpath()'方法](http://de2.php.net/manual/en/simplexmlelement.xpath.php)。請澄清問題。 – Gordon 2011-06-13 09:03:25

+0

嗨@Gordon - 我試圖找出我需要取代$ price = $ entry-> price;在我上面的代碼中給出了XML中每個「item」的單個w:價格值。我在下面的建議中使用了$ price = $ wxml-> xpath('// w:price'),但是這會返回一個數組 - 因爲每個「item」中只有一個「w:price」節點,我認爲它會起作用。 .. – Chris 2011-06-13 09:28:04

+0

在這種情況下,你必須使用['children()'](http://de2.php.net/manual/en/simplexmlelement.children.php)。有關類似問題,請參見[PHP SimpleXML命名空間問題](http://stackoverflow.com/questions/6027398/php-simplexml-namespace-problem/6027507#6027507)。 – Gordon 2011-06-13 09:30:30

回答

0

您正處於正確的軌道上。你所要做的就是用命名空間編寫一個xpath查詢。喜歡的東西:

$wxml->xpath ('//w:price') 
+0

謝謝@datasage。當我替換$ price = $ entry-> price; $ price = $ wxml-> xpath('// w:price');在上面的代碼中,我得到的輸出是「Array」。然而,每個「item」中只有一個「w:price」節點,所以我認爲它應該每次挑選一個單獨的價格,而不是數組? – Chris 2011-06-13 09:22:47

+0

@Chris陣列中有多少個元素? – 2011-06-13 19:48:59