<?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;
}
但没有输出
答案 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表达式)。