使用php domxml读取xml文件时出错?

时间:2013-04-09 05:02:22

标签: php xml domdocument xml-namespaces

我有一个文件test.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;
}

=&GT;错误无法获得价值,如何得到这个,结果是“你好世界”

1 个答案:

答案 0 :(得分:3)

您使用的是错误的元素名称。方法getElementsByTagName需要本地名称,即您的creator

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

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

进入DOMDocument。你得到一个警告:

  

警告:DOMDocument :: loadXML():创建者上的命名空间前缀dc未在实体中定义

由于未定义名称空间前缀,DOMDocument将删除它。这导致以下XML:

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

正如您所看到的,本地名称 creator没有包含 xmlns-prefix dc<dc:creator>的元素)任何更长的时间。

但是,由于您已经为您的示例粘贴了错误的XML,并且可能在您的真实XML中定义了名称空间前缀 ,您只是询问如何使用命名空间前缀访问标记(这是冒号:之前的部分。这已在此处概述:

如果你想要一个标签位于其自己的命名空间内的元素,你需要告诉 DOMDocument 你指的是哪个命名空间:

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