$xml = '<?xml version="1.0" encoding="UTF-8"?> <stw:ThumbnailResponse xmlns:stw="http://www.shrinktheweb.com/doc/stwresponse.xsd"> <stw:Response> <stw:ThumbnailResult> <stw:Thumbnail Exists="true">http://imagelink.com</stw:Thumbnail> <stw:Thumbnail Verified="false">delivered</stw:Thumbnail> </stw:ThumbnailResult> <stw:ResponseStatus> <stw:StatusCode>refresh</stw:StatusCode> </stw:ResponseStatus> <stw:ResponseTimestamp> <stw:StatusCode>1413812009</stw:StatusCode> </stw:ResponseTimestamp> <stw:ResponseCode> <stw:StatusCode>HTTP:200</stw:StatusCode> </stw:ResponseCode> <stw:CategoryCode> <stw:StatusCode></stw:StatusCode> </stw:CategoryCode> <stw:Quota_Remaining> <stw:StatusCode>132</stw:StatusCode> </stw:Quota_Remaining> <stw:Bandwidth_Remaining> <stw:StatusCode>999791</stw:StatusCode> </stw:Bandwidth_Remaining> </stw:Response> </stw:ThumbnailResponse>'; $dom = new DOMDocument; $dom->loadXML($xml); $result = $dom->getElementsByTagName('stw:Thumbnail')->item(0)->nodeValue; $status = $dom->getElementsByTagName('stw:Thumbnail')->item(0)->nodeValue; echo $result;
Наличие вышеуказанного кода должно выводить http://imagelink.com, а статус $ должен содержать «доставлен» – но ни одна из этих работ не работает, я оставляю сообщение об ошибке:
Trying to get property of non-object
Я пробовал различные альтернативы синтаксического анализа xml, такие как simplexml (но это не сработало, когда имена тегов были: в нем), и я пробовал прокручивать каждую область в xml (ThumbNailresponse, response, а затем thumbnailresult) без везения.
Как я могу получить значения внутри stw: Thumbnail?
Используя простой xml, вы можете использовать метод ->children()
для этого:
$xml = simplexml_load_string($xml_string); $stw = $xml->children('stw', 'http://www.shrinktheweb.com/doc/stwresponse.xsd'); echo '<pre>'; foreach($stw as $e) { print_r($e); // do what you have to do here }
Вам нужно указать пространство имен, а метод DOMDocument :: getElementsByTagName не сможет обработать его. В руководстве :
Локальное имя ( без пространства имен ) тега для соответствия.
Вместо этого вы можете использовать DOMDocument :: getElementsByTagNameNS :
$dom = new DOMDocument; $dom->loadXML($xml); $namespaceURI = 'http://www.shrinktheweb.com/doc/stwresponse.xsd'; $result = $dom->getElementsByTagNameNS($namespaceURI, 'Thumbnail')->item(0)->nodeValue;
Этот код на самом деле работает отлично для меня —
Как правило, такая ошибка означает, что вы можете опечатать свой объект $dom
– дважды проверьте его и повторите попытку.
Кроме того, примечательно, что вы захотите изменить item(0)
на item(1)
при настройке переменной $status
.
$result = $dom->getElementsByTagName('stw:Thumbnail')->item(0)->nodeValue; $status = $dom->getElementsByTagName('stw:Thumbnail')->item(0)->nodeValue;