如何使用php Xpath从XML列出所有命名空间

时间:2017-07-10 12:32:01

标签: php xpath

<?xml version="1.0" encoding="US-ASCII" ?>
<main:docs xmlns:admin="someval" xmlns:system="someval" xmlns:links="someval">
    XML content here
</main:docs>

我想列出XML中使用的命名空间xmlns:admin,xmlns:system,xmlns:links。

我尝试过像

$doc = new DOMDocument();

$context = $doc->documentElement;

$xpath = new DOMXPath($doc);

$xml = simplexml_load_file("path to xml");

foreach( $xpath->query('namespace::*', $context) as $node ) 
{
  echo $node->nodeName;
}

但没有输出

1 个答案:

答案 0 :(得分:0)

简短的回答是,你没有。最重要的xmlns:admin不是命名空间,而只是别名/前缀。实际的名称空间是您用someval替换的值。

SimpleXMLElement::getNamespaces()(来自您的评论)是一种仅用于调试的方法。您不应该从文档中读取名称空间前缀,它们只对当前上下文有效。

$xml = <<<'XML'
<foo:outer xmlns:foo="urn:foo">
  <bar:inner xmlns:bar="urn:bar"/>
</foo:outer>
XML;

$outer = new SimpleXMLElement($xml);
var_dump(
  $outer->getNamespaces()
);
var_dump(
  $outer->children('urn:bar')->inner->getNamespaces()
);

输出:

array(1) {
  ["foo"]=>
  string(7) "urn:foo"
}
array(1) {
  ["bar"]=>
  string(7) "urn:bar"
}

任何元素节点都允许使用命名空间定义,您可以为元素定义默认命名空间。

因此,您使用实际的名称空间URI。将它们放入代码中的变量/数组中。使用SimpleXMLElement::registerXpathNamespace()为命名空间注册自己的前缀(对于Xpath表达式)。