【问题标题】:Error when read xml file using php domxml?使用 php domxml 读取 xml 文件时出错?
【发布时间】:2013-04-09 16:08:43
【问题描述】:

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

=> error can't get value, 如何得到这个,结果是“hello world”

【问题讨论】:

  • "dc" 这里是一个命名空间,它不被视为“标签名称”的一部分。试试getElementsByTagNameNS

标签: php xml domdocument xml-namespaces


【解决方案1】:

您使用了错误的元素名称。方法 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>

如您所见,不再有 本地名称 creatorxmlns 前缀 dc (&lt;dc:creator&gt;) 的元素。 p>

但是,就像您为示例粘贴了错误的 XML 一样,并且可能在您的真实 XML 中定义了命名空间前缀 is,您只是在询问如何使用命名空间前缀访问标签 (这是冒号之前的部分:)。此处已对此进行了概述:

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

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

【讨论】:

    猜你喜欢
    • 2015-09-18
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 2011-10-01
    • 2010-11-21
    相关资源
    最近更新 更多