2012-06-14 81 views
0

我有以下形式的XML,我想用PHP解析(我无法更改XML的格式)。 SimpleXML和DOM似乎都不能处理不同的命名空间 - 任何人都可以给我示例代码吗?下面的代码没有给出结果。在PHP中使用多个名称空间解析XML

<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'定义的URI,和'entry': '前缀),请仅仅为了它,找到SO上的数百个类似问题之一。这远远不是一个新问题。 – Wrikken

+0

只是'$ doc-> getElementsByTagName(“entry”);'手册中的关键字是*本地名*。 – Gordon

回答

3

我只是想发布一个答案这个可怕的问题,使用XPath。抱歉。

命名空间与DOM无关 - 我只是没有从Element获取nodeValue。

$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]); 
} 

之后,你在$ xmlsimple