У меня есть следующий XML:
<ns1:getBannerLinksResponse xmlns:ns1="http://endpoint.website.com/"> <ns1:return> <ns1:campaignID>0</ns1:campaignID> <ns1:categoryID>200230455</ns1:categoryID> <ns1:categoryName>Promotion</ns1:categoryName> <ns1:linkID>10001599</ns1:linkID> <ns1:linkName>KFL-20% off No Min</ns1:linkName> <ns1:mid>3071</ns1:mid> <ns1:nid>1</ns1:nid> <ns1:clickURL> http://someurl </ns1:clickURL> <ns1:endDate>Oct 15, 2012</ns1:endDate> <ns1:height>250</ns1:height> <ns1:iconURL> http://someurl </ns1:iconURL> <ns1:imgURL> http://someurl </ns1:imgURL> <ns1:landURL> http://someurl </ns1:landURL> <ns1:serverType>22</ns1:serverType> <ns1:showURL> http://someurl </ns1:showURL> <ns1:size>13</ns1:size> <ns1:startDate>Oct 14, 2012</ns1:startDate> <ns1:width>300</ns1:width> </ns1:return> </ns1:getBannerLinksResponse>
Я попробовал следующее:
$data = new SimpleXMLElement($xml); $data->registerXPathNamespace('ns1','http://endpoint.website.com/'); foreach($data->xpath('//ns1:return') as $banner) { $banner->registerXPathNamespace('ns1','http://endpoint.website.com/'); var_dump($banner); }
Все что тебе нужно это
$data = new SimpleXMLElement($xml); $data->registerXPathNamespace('ns1','http://endpoint.websitecom/'); $part = $data->xpath("//ns1:return"); var_dump($part[0]->children("ns1",true));
Вывод
object(SimpleXMLElement)[3] public 'campaignID' => string '0' (length=1) public 'categoryID' => string '200230455' (length=9) public 'categoryName' => string 'Promotion' (length=9) public 'linkID' => string '10001599' (length=8) public 'linkName' => string 'KFL-20% off No Min' (length=18) public 'mid' => string '3071' (length=4) public 'nid' => string '1' (length=1) public 'clickURL' => string ' http://someurl ' (length=36) public 'endDate' => string 'Oct 15, 2012' (length=12) public 'height' => string '250' (length=3) public 'iconURL' => string ' http://someurl ' (length=36) public 'imgURL' => string ' http://someurl ' (length=36) public 'landURL' => string ' http://someurl ' (length=36) public 'serverType' => string '22' (length=2) public 'showURL' => string ' http://someurl ' (length=36) public 'size' => string '13' (length=2) public 'startDate' => string 'Oct 14, 2012' (length=12) public 'width' => string '300' (length=3)
Вам нужно использовать метод ->children()
. Если вы избегаете XPath и просто используете операторы SimpleXML, ваш код будет намного проще.
Элементы, пропущенные именами, также являются одной из многих вещей, которые не видны при использовании стандартных функций отладки PHP для отладки довольно волшебных объектов SimpleXML. (В приведенном ниже simplexml_dump()
используется моя simplexml_dump()
.)
$data = new SimpleXMLElement($xml); $banner = $data->children('ns1', true)->return; // Or to avoid relying on the 'ns1' alias: ->children('http://endpoint.website.com/', false); simplexml_dump($banner);
Обратите внимание, что пространство имен 'ns1' остается выбрано до следующего вызова ->children()
:
// Remember to cast to string if you want the content of an element or attribute var_dump( (string)$banner->linkName );
Если <return>
может возникать несколько раз, это, очевидно, становится:
foreach ( $data->children('ns1', true)->return as $banner ) { simplexml_dump($banner); }