我正在使用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>
元素?
答案 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