2012-05-08 51 views
0

我有以下XML:http://pastebin.com/QiRK72BKPHP SimpleXMLElement XPath選擇

它是響應REST查詢而生成的。我的代碼很簡單:

$xml = simplexml_load_file($url); 

var_dump($xml->getName()); 

var_dump($xml->xpath("serverDetail/apiEnv")); 

在一個嘗試的測試案例中。第一個var_dump顯示XML文件確實正在加載:

string(21) "GeneralSearchResponse" 

但是,第二個var_dump使我困惑。我覺得它一定要搭配一些數據,而是我得到

array(0) { } 

我也試過的XPath「/ serverDetail/apiEnv」「// apiEnv」和「/」,始終得到一個空數組。我誤解xpath或者可能缺少一些初始化步驟?

+1

你有一個鏈接原來的xml?複製和粘貼你的pastebin響應讓我感到害怕simplexml_load_file。 – ccKep

+0

原始鏈接使用私有API密鑰,但這些演示憑據應該可以工作:http://sandbox.api.shopping.com/publisher/3.0/rest/GeneralSearch?apiKey=78b0db8a-0ee1-4939-a2f9-d3cd95ec0fcc&trackingId=7000610& keyword = 013803105384 – Ben

回答

2

你的XML使用命名空間:

$xml->registerXPathNamespace('u', 'urn:types.partner.api.shopping.com'); 
var_dump($xml->xpath("//u:serverDetail/u:apiEnv")); 

輸出:

array(1) { 
    [0]=> 
    object(SimpleXMLElement)#2 (1) { 
    [0]=> 
    string(7) "sandbox" 
    } 
} 

編輯:骯髒的解決辦法,可能會有所幫助,但:

$xml = simplexml_load_file($url); 
$xmlStr = str_replace("xmlns", "ns", $xml->asXML()); 
$xml = new SimpleXMLElement($xmlStr); 
var_dump($xml->xpath("serverDetail/apiEnv")); 
+0

哇,這有點令人討厭,必須在每個元素前加一個名稱空間別名,但是不會讓你! – Ben

+0

不僅如此,'registerXPathNamespace()'只適用於**下一個** xpath調用。我在很久以前用xml做的不多,不知道有沒有更好的方法。 – ccKep

+0

編輯我的迴應,也許它有幫助。 – ccKep