2016-11-21 15 views
1

У меня возникли проблемы с получением значений тегов XML-канала, который имеет пространство имен.Получение массива значений из содержимого XML с пространством имен в PHP

Я прочитал и попытался реализовать некоторые из рекомендованных ответов на предыдущие вопросы, но я все еще получаю пустой массив, или предупреждение, как

Warning: SimpleXMLElement::xpath() [simplexmlelement.xpath]: Undefined namespace prefix 

Я прочитал Parse XML with Namespace using SimpleXML.

данные корма

XML-выглядит следующим образом:

<Session> 
     <AreComplimentariesAllowed>true</AreComplimentariesAllowed> 
     <Attributes xmlns:d3p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
     <d3p1:string>0000000009</d3p1:string> 
     <d3p1:string>0000000011</d3p1:string> 
     </Attributes> 
</Session> 

Мой текущий код:

foreach($xml->Session as $event){ 
    if(!empty($event->Attributes)){ 
     foreach($event->xpath('//Attributes:d3p1') as $atts) { 
      echo $atts."<br />"; 
     } 
    } 
} 

Любое руководство будет оценено.

Спасибо.

ответ

1

Вы должны зарегистрировать пространство имен:

foreach ($xml->xpath('//Attributes') as $attr) { 
    $attr->registerXPathNamespace('ns', 
    'http://schemas.microsoft.com/2003/10/Serialization/Arrays'); 
    foreach ($attr->xpath('//ns:string') as $string) { 
    echo $string, PHP_EOL; 
    } 
} 

В случае, если вы хотите получать только значения из string тегов:

$xml->registerXPathNamespace('ns', 
    'http://schemas.microsoft.com/2003/10/Serialization/Arrays'); 
foreach ($xml->xpath('//Attributes/ns:string') as $string) { 
    echo $string, PHP_EOL; 
} 
+0

Спасибо за это. Non из них работал, но будет ли это потому, что ссылка в пространстве имен теперь мертва? http://schemas.microsoft.com/2003/10/Serialization/Arrays – David

+0

@David, фактически оба образца работают, если вы правильно загружаете '$ xml'. [Пример] (https://eval.in/682071) –

+0

Изначально я использую cURL для получения данных в виде XML (curl_setopt ($ ch, CURLOPT_HTTPHEADER, array («Accept: application/xml»), а затем загружаю с помощью: $ xml = new SimpleXMLElement (str_replace («&», «&», $ data)); – David