使用PHP DOMDocument从带有冒号的命名空间的xml节点获取值

时间:2018-01-25 00:46:32

标签: php xml namespaces domdocument

我正在使用DOMDocument类解析xml文档。首先,我选择了名称为' item'的所有节点。使用$xml->getElementsByTagName('item')方法。我的示例xml文件如下所示:

<item>
      <title>...</link>
      <description>...</description>
      <pubDate>...</pubDate>
      <ns:author>...</dc:creator>
</item>

但是我的问题是从嵌套标记获取值,命名空间名称带冒号。我使用foreach$node->getElementsByTagName('description')->item(0)->nodeValue中从没有名称空间的节点获取值,并且没有错误。

我还发现方法getElementsByTagNameNs()来获取带有它的命名空间的节点。但是,当我尝试像没有命名空间的前一个节点那样获取nodeValue时,我得到了&#34; PHP注意:尝试获取非对象的属性&#34;。我认为这很奇怪,因为getElementsByTagNameNs()->item(0)返回对象DOMElement。

您是否知道如何从带有命名空间的节点获取值,在本例中为<ns:author></dc:creator>元素?

1 个答案:

答案 0 :(得分:1)

由于您提供的文档片段不完整甚至无效,我不得不做一些更改。你说你希望<ns:author>...</dc:creator>的值不是一个有效元素,因为名称和命名空间中的开放和关闭名称都不同,你会期望像<ns:author>...</ns:author>

作为如何从命名空间获取值的示例(使用对XML进行的一些更正和一些猜测的更改)...

$xml = <<<XML
<?xml version="1.0"?>
<items xmlns:ns="http://some.url">
    <item>
      <title>title</title>
      <description>Descr.</description>
      <pubDate>1/1/1970</pubDate>
      <ns:author>author1</ns:author>
    </item>
</items>
XML;

$dom = new DOMDocument( '1.0', 'utf-8' );
$dom->loadXML($xml);
$items = $dom->getElementsByTagName('item');
foreach ( $items as $item )  {
    $author = $item->getElementsByTagNameNS("http://some.url", "*")->item(0)->nodeValue;
    echo "Author = ".$author.PHP_EOL;
}

getElementsByTagNameNS()中,您需要为此命名空间输入正确的URL,该URL应位于源文档中。

这输出......

Author = author1