获取根节点的XML命名空间


Get XML namespace of root node

我收到类似于的xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://adress.pl/FeResourceServlet/localTemplate/template1/styl.xsl"?>
<wnio:Dokument 
xmlns:adr="http://adress.pl/xml/schema/adress/2009/11/09/" 
xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
xmlns:ev="http://www.w3.org/2001/xml-events" 
xmlns:inst="http://adress.pl/xml/schematy/instytucja/2009/11/16/" 
xmlns:meta="http://adress.pl/xml/schematy/meta/2009/11/16/" 
xmlns:oso="http://adress.pl/xml/schematy/osoba/2009/11/16/" 
xmlns:str="http://adress.pl/xml/schematy/struktura/2009/11/16/"      xmlns:wnio="http://epuap.gov.pl/FeResourceServlet/localTemplate/ZgloszenieBudowy/" 
xmlns:xf="http://www.w3.org/2002/xforms" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
xsi:schemaLocation="http://adress.pl/FeResourceServlet/localTemplate/template1/ http://epuap.gov.pl/FeResourceServlet/localTemplate/template1/schema.xsd">
...

我的问题是-如何获得root的命名空间?在我的根节点上方是wnio:Dokument,我知道wnio是"根的命名空间",根的名称是Dokument。

但是名称和命名空间可以更改。然后我会有根节点,但我不知道名称空间和根的名称。

到目前为止,我使用了:SimpleXMLElement::getNamespaces和SimpleXMLElement::getDocNamespaces。但我收到了每个名称空间,但我不知道哪个是根。

在PHP中可以获得这些信息吗?

DOM节点具有返回节点名称空间的属性$namespaceURI

$document = new DOMDocument();
$document->loadXml(
  '<wnio:Dokument xmlns:wnio="http://epuap.gov.pl/FeResourceServlet/localTemplate/ZgloszenieBudowy/"/>'
);
var_dump($document->documentElement->namespaceURI);

但是名称空间是XML文档中最稳定的部分。命名空间指定信息的格式。如果名称空间发生更改,格式也会发生更改,您将不得不更改应用程序的逻辑。

你的应用程序需要知道它读取的格式,并期望得到它。这就是名称空间。

另一方面,命名空间前缀可以在任何元素节点上更改。您应该期望一个特定的前缀,但您可以也必须期望一个具体的命名空间。

这里有一个例子:

$document = new DOMDocument();
$document->loadXml(
  '<wnio:Dokument xmlns:wnio="http://epuap.gov.pl/FeResourceServlet/localTemplate/ZgloszenieBudowy/"/>'
);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('w', 'http://epuap.gov.pl/FeResourceServlet/localTemplate/ZgloszenieBudowy/');
foreach ($xpath->evaluate('/w:Dokument') as $node) {
  var_dump($node->nodeName);
}

输出:

string(13) "wnio:Dokument"

您可以使用DomDocument

$dom = new DOMDocument();
$response = $dom->loadXML($xml);//$xml is your xml string or file
$root = $dom->documentElement;//will return the document root element
$rootPrefix = $root->prefix;//getting the prefix of your element
$namespace = $root->lookupNamespaceURI($rootPrefix);//getting the namespace of the root element

[documentElement][2]属性是将根元素作为DOMElement获取的一种简单方法。