2012-06-14 113 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