PHP:检索DomeElement的所有声明名称空间

PHP:检索DomeElement的所有声明名称空间,php,dom,xml-namespaces,Php,Dom,Xml Namespaces,我正在使用解析包含的xml文件。我本以为名称空间声明与任何其他属性一样处理,但我的测试似乎不同意。我有一份文件是这样开头的: <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http:

我正在使用解析包含的xml文件。我本以为名称空间声明与任何其他属性一样处理,但我的测试似乎不同意。我有一份文件是这样开头的:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="http://purl.org/rss/1.0/"
    xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:prism="http://purl.org/rss/1.0/modules/prism/"
    xmlns:admin="http://webns.net/mvcb/"
    >
$doc = new DOMDocument();
$doc->loadXml(file_get_contents('/home/soulmerge/tmp/rss1.0/recent.xml'));
$root = $doc->documentElement;
var_dump($root->tagName);
# prints 'string(7) "rdf:RDF"'
var_dump($root->attributes->item(0));
# prints 'NULL'
var_dump($root->getAttributeNode('xmlns'));
# prints 'object(DOMNameSpaceNode)#3 (0) {}'
因此,问题是:

  • 有人知道我在哪里可以找到
    DOMNameSpaceNode
    的文档吗?A不会产生任何有用的结果
  • 如何从domeElement提取所有这些名称空间声明

  • 除非有一种更直接的方法可以使用XPath及其语法。
    e、 g


    编辑并顺便说一句:我也没有找到DOMNameSpaceNode的文档。但是您可以从ext/dom/php_dom.c中的源代码中“扣除”(部分)它的功能
    它似乎没有公开任何方法和属性

    "nodeName", "nodeValue", "nodeType",
    "prefix", "localName", "namespaceURI",
    "ownerDocument", "parentNode"
    
    所有这些都由与相应的DOMNode属性相同的函数处理。

    注意

    echo $root->getAttributeNode('xmlns')->nodeValue . "\n";
    echo $root->getAttribute('xmlns') . "\n";
    echo $root->getAttribute('xmlns:syn') . "\n";
    
    所有工作按预期进行,并打印出来

    http://purl.org/rss/1.0/
    http://purl.org/rss/1.0/
    http://purl.org/rss/1.0/modules/syndication/
    
    因为DOMNameSpaceNode是一个节点,而不是NodeCollection


    只是澄清一下,除非PHP DOM扩展中的某些内容发生更改,否则XPath(如VolkerK所解释的)是获取所有名称空间的唯一本地方法,而不管文档如何。

    非常感谢,这绝对是一个有效的解决方案。我想我必须等到php文档更新后才能正确实现。请注意,
    $xpath->query('namespace:*',$context)
    列出了在
    $context
    元素之前声明的所有名称空间,而不仅仅是直接在其属性中声明的名称空间。您可以使用
    $context->hasAttribute($node->nodeName)
    过滤它们。谢谢,干果。
    echo $root->getAttributeNode('xmlns')->nodeValue . "\n";
    echo $root->getAttribute('xmlns') . "\n";
    echo $root->getAttribute('xmlns:syn') . "\n";
    
    http://purl.org/rss/1.0/
    http://purl.org/rss/1.0/
    http://purl.org/rss/1.0/modules/syndication/