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

时间:2011-06-09 14:53:55

标签: 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"

   ...
>

当我尝试点什么时,请点击这个:

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

我确实得到了'其他'属性,比如id,viewBox等,但不是xlmns:dc等。

有没有办法获得这些呢?

2 个答案:

答案 0 :(得分:1)

尝试使用namespaceURI

  

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

要获取根节点的默认namespaceURI,请使用

$dom->documentElement->namespaceURI;

demo

在链接副本中查看我的答案,了解如何获取所有命名空间属性。

替代方案是使用XPath:

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

demo

答案 1 :(得分:1)

如果要解析整个文档,从每个属性值中提取名称空间前缀,然后使用DOMNode::lookupNamespaceURI(字符串$ prefix)构建prefix-uri映射将比使用simplexml减少开销。