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

 <?xml version =“1.0”encoding =“US-ASCII”?> 
< ; main:docs xmlns:admin =“someval”xmlns:system =“someval”xmlns:links =“someval”>
此处的XML内容
< / main:docs>
</ code> </ pre>

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

我试过它</ p>

  $ doc = new DOMDocument(); 

$ context = $ doc-&gt; documentElement ;

$ xpath = new DOMXPath($ doc);

$ xml = simplexml_load_file(“xml的路径”);

foreach($ xpath-&gt; query('namespace :: *', $ context)作为$ node)
{
echo $ node-&gt; nodeName;
}
</ code> </ pre>

但没有输出</ p>
< / DIV>

展开原文

原文

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

I want to list out namespace used in XML that is xmlns:admin, xmlns:system, xmlns:links.

I tried it like

$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;
}

but no output

dongzhi5386
dongzhi5386 我在这里得到了解决方案php.net/manual/en/simplexmlelement.getnamespaces.php
3 年多之前 回复
dspv70887
dspv70887 只声明名称空间的命名空间,如xmlns:system,xmlns:admin
3 年多之前 回复
dongquan8753
dongquan8753 只有节目名称或值吗?
3 年多之前 回复

1个回答



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

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

  $ xml =&lt;&lt;&lt;'XML'
&lt; foo:outer xmlns:foo =“urn:foo”&gt;
&lt; bar:inner xmlns:bar =“urn:bar”/&gt;
&lt; / foo:outer&gt;
XML;

$ outer = new SimpleXMLElement($ xml);
var_dump(
$ outer-&gt; getNamespaces()

);
var_dump(
$ outer-&gt; children('urn:bar') - &gt; inner-&gt; getNamespaces()
);
</ code> </ pre>

输出:</ p>

  array(1){
[“foo”] =&gt;
string(7)“urn:foo”
}
array (1){
[“bar”] =&gt;
string(7)“urn:bar”
}
</ code> </ pre>

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

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

展开原文

原文

The short answer is, you don't. Most important xmlns:admin is not the namespace but just an alias/prefix. The actual namespaces are the values you replaced with someval.

SimpleXMLElement::getNamespaces() (from you comment) is a method for debugging only. You should not read the namespaces prefixes from the document, they will only be valid for the current context anyway.

$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()
);

Output:

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

Namespace definitions are allowed on any element node and you can define a default namespace for elements.

So you work with the actual namespace URI. Put them into a variable/array on you code. Use SimpleXMLElement::registerXpathNamespace() to register your own prefixes for a namespace (for Xpath expressions).

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐