2013-04-09 112 views
2

我有一個文件的test.xml使用php domxml讀取xml文件時出錯?

<?xml version="1.0" encoding="UTF-8"?> 
<item> 
<dc:creator><![CDATA[hello world]]></dc:creator> 
</item> 

和代碼的PHP

$doc = new DOMDocument(); 
$doc->load('test.xml'); 
$items = $doc->getElementsByTagName('item'); 
foreach ($items as $item) { 
    $authors = $item->getElementsByTagName("dc:creator"); 
    $author = $authors->item(0)->nodeValue; 
    echo $author; 
} 

=>誤差不能獲得價值,如何得到這個,結果爲 「Hello World」 的

+1

「dc」這裏是一個命名空間,它不被視爲「標記名稱」的一部分。試試['getElementsByTagNameNS'](http://www.php.net/manual/en/domelement.getelementsbytagnamens.php)。 – Passerby 2013-04-09 05:10:24

回答

3

您正在使用錯誤的元素名稱。方法getElementsByTagName需要本地名稱,即creator

你可以看到,如果您加載示例XML

<?xml version="1.0" encoding="UTF-8"?> 
<item> 
<dc:creator><![CDATA[hello world]]></dc:creator> 
</item> 

到DOMDocument。你得到一個警告:

警告:DOM文檔:: loadXML的():在創作者名稱空間前綴DC是不是在實體

定義的,因爲命名空間前綴沒有定義,DOM文檔將刪除它。這將導致以下XML:

<?xml version="1.0" encoding="UTF-8"?> 
<item xmlns:dc="ns:1"> 
<creator><![CDATA[hello world 2]]></creator> 
</item> 

正如你可以看到有與本地名稱creator的xmlns前綴dc<dc:creator>)不再無元素。

但正如你就像已經貼上了錯誤的XML爲你的榜樣,並有可能的命名空間前綴是你真正的XML定義,你只是詢問如何與一個命名空間前綴訪問代碼(也就是部分在冒號:之前)。這一點已經在這裏概述:

如果你想要的是標籤是它自己的命名空間裏的元素,你需要告訴DOM文檔該命名空間中的意思是:

$dcUri = $doc->lookupNamespaceUri('dc'); 
$authors = $item->getElementsByTagNameNS($dcUri, 'creator'); 
$author = $authors->item(0)->nodeValue;