簡體   English   中英

如何使用php Xpath從XML列出所有名稱空間

[英]How to list all namespace from XML using 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;
}

但沒有輸出

簡短的答案是,您不會。 最重要的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表達式)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM