2012-06-14 3 views
0

У меня есть XML в следующей форме, которую я хочу проанализировать с помощью PHP (я не могу изменить формат XML). Ни SimpleXML, ни DOM, похоже, не обрабатывают разные пространства имен - может ли кто-нибудь дать мне пример кода? Приведенный ниже код не дает никаких результатов.Анализ XML с несколькими пространствами имен в PHP

<atom:feed> 
     <atom:entry> 
      <atom:id /> 
      <otherns:othervalue /> 
     </atom:entry> 
     <atom:entry> 
      <atom:id /> 
      <otherns:othervalue /> 
     </atom:entry> 
    </atom:feed> 



    $doc = new DOMDocument(); 
    $doc->load($url); 
    $entries = $doc->getElementsByTagName("atom:entry"); 
    foreach($entries as $entry) { 
     $id = $entry->getElementsByTagName("atom:id"); 
     echo $id; 
     $othervalue = $entry->getElementsByTagName("otherns:othervalue"); 
     echo $othervalue; 
    } 
+2

'SimpleXMLElement-> children' или' DOMElement :: getElementsByTagNameNS (строка $ NamespaceURI, строка $ LocalName) '(который будет УИР определяется' atom' и 'entry' без' атома: 'prefix), и, пожалуйста, просто для этого, найдите один из сотен подобных вопросов здесь, на SO. Это НЕ новый вопрос длинным выстрелом. – Wrikken

+0

просто '$ doc-> getElementsByTagName (" entry ");' Ключевое слово в руководстве - это локальное имя *. – Gordon

ответ

3

Я просто хочу, чтобы получить возможность отправлять с ответом на этот ужасный вопрос. Сожалею.

Пространства имен не имеют отношения к DOM - я просто не получил nodeValue от Element.

$doc = new DOMDocument(); 
$doc->load($url); 
$feed = $doc->getElementsByTagName("entry"); 
foreach($feed as $entry) { 
    $id = $entry->getElementsByTagName("id")->item(0)->nodeValue; 
    echo $id; 
    $id = $entry->getElementsByTagName("othervalue")->item(0)->nodeValue; 
    echo $othervalue; 
} 
-1

Вам необходимо указать свои пространства имен. В противном случае simplexml будет игнорировать их. Этот бит кода я получил от PHP инструкции, и я использовал в своем собственном проекте

$xmlsimple = simplexml_load_string('YOUR XML'); 
$namespaces = $xmlsimple->getNamespaces(true); 
$extensions = array_keys($namespaces); 

foreach ($extensions as $extension) 
{ 
    $xmlsimple->registerXPathNamespace($extension,$namespaces[$extension]); 
} 

После того, что вы используете XPath на $ xmlsimple

Смежные вопросы