DOMDocument xmlns 属性 - 如何获取它们?

Dyl*_*lan 5 php attributes namespaces domdocument

我正在使用 DOMDocument 读取 XML (SVG),其中包含命名空间。我遍历所有节点的属性,但似乎无法获取根元素的“xmlns”类型属性。

XML 看起来像这样:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

   id="svg2"
   sodipodi:version="0.32"
   inkscape:version="0.48.1 "
   viewBox="0,0 534,616"

   ...
>
Run Code Online (Sandbox Code Playgroud)

当我尝试类似这样的事情时:

$node= DOMDocument->documentElement;
foreach($node->attributes as $attribute) {
  echo $attribute->nodeName."\n";
}
Run Code Online (Sandbox Code Playgroud)

我确实获得了“其他”属性,例如 id、viewBox 等,但没有获得 xlmns:dc 等。

有没有办法获得这些?

Gor*_*don 1

尝试用namespaceURI

该节点的命名空间 URI,如果未指定则为 NULL。

要获取根节点的默认命名空间URI,您可以使用

$dom->documentElement->namespaceURI;
Run Code Online (Sandbox Code Playgroud)

演示

有关如何获取所有命名空间属性,请参阅链接副本中我的答案。

另一种方法是使用 XPath:

$xpath = new DOMXPath($dom);
foreach ($xpath->query('namespace::*', $context) as $node) {
    echo $node->nodeValue;
}
Run Code Online (Sandbox Code Playgroud)

演示