代码之家  ›  专栏  ›  技术社区  ›  soulmerge

php:检索domElement的所有声明的命名空间

  •  7
  • soulmerge  · 技术社区  · 15 年前

    我用的是 DOM extension 解析包含 xml namespaces . 我本以为名称空间声明和其他属性一样被处理,但我的测试似乎不同意。我有一个这样开头的文档:

    <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) {}'
    

    所以问题是:

    1. 有人知道我在哪里能找到 DOMNameSpaceNode ?一 search on php.net 不会产生任何有用的结果。
    2. 如何从该domElement中提取所有这些名称空间声明?
    2 回复  |  直到 14 年前
        1
  •  11
  •   VolkerK    15 年前

    除非有更直接的方法可以使用xpath及其 namespace axis .
    例如

    <?php
    $doc = new DOMDocument;
    $doc->loadxml('<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/"
        >
    ...
    </rdf:RDF>');
    $context = $doc->documentElement;
    
    $xpath = new DOMXPath($doc);
    foreach( $xpath->query('namespace::*', $context) as $node ) {
      echo $node->nodeValue, "\n";
    }
    

    印刷品

    http://www.w3.org/XML/1998/namespace
    http://webns.net/mvcb/
    http://purl.org/rss/1.0/modules/prism/
    http://purl.org/rss/1.0/modules/syndication/
    http://purl.org/dc/elements/1.1/
    http://purl.org/rss/1.0/modules/taxonomy/
    http://purl.org/rss/1.0/
    http://www.w3.org/1999/02/22-rdf-syntax-ns#
    

    edit和btw:我也没有找到domnamespacenode的文档。但是您可以从ext/dom/php_dom.c中的源代码“推断”(部分)它的功能
    它似乎不公开任何方法并公开属性

    "nodeName", "nodeValue", "nodeType",
    "prefix", "localName", "namespaceURI",
    "ownerDocument", "parentNode"
    

    所有这些都由与相应的domnode属性相同的函数处理。

        2
  •  4
  •   driedfruit    14 年前

    注意,

    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解释)是获取所有名称空间的唯一本地方法,而不管文档如何。