2012-05-08 5 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? Скопировать и вставить свой ответ на пастообразный отброс черта из файла 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" 
    } 
} 

Edit: Грязный обходной путь, может быть полезным, хотя:

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

Ничего себе, это немного неприятно, чтобы префикс каждого элемента с псевдонимом пространства имен, но thannnk you! – Ben

+0

Не только это, 'registerXPathNamespace()' работает только для ** следующего ** вызова xpath. Я много времени не делал с xml, не знаю, есть ли лучший способ. – ccKep

+0

Отредактировал мой ответ, возможно, это помогает. – ccKep