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

标签 php xml namespaces domdocument

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

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

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

我还找到了方法 getElementsByTagNameNs() 来获取具有命名空间的节点。但是,当我尝试像以前没有命名空间的节点一样获取 nodeValue 时,我得到“PHP 通知:试图获取非对象的属性”。我觉得这很奇怪,因为 getElementsByTagNameNs()->item(0)返回对象 DOMElement。

你知道如何从具有命名空间的节点中获取值,在这种情况下 <ns:author></dc:creator>元素?

最佳答案

由于您提供的文档片段不完整甚至无效,我不得不进行一些更改。你说你想要<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,它应该在源文档中。

这输出...
Author = author1

关于php - 使用 PHP DOMDocument 从带有冒号的命名空间的 xml 节点获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48433965/

相关文章:

php - C++ WinSock 从 PHP 页面获取数据?

php - 插入多个用户和随 secret 码 Php Mysql

php - 将 XML 存储在数组中

java - 如何从元素中获取值?

php - "Call to undefined function"调用自定义 Composer 包中的函数时

c++ - 是否可以使用在没有命名空间的命名空间中声明的类名::

php 与正在运行的 c++ 交互

javascript - TinyMCE 和 Yii

java - 如何给根节点添加属性

r - 在 R 包中记录重新导出的函数