获取根节点的XML名称空间

时间:2015-11-27 13:16:21

标签: php xml parsing xml-namespaces

我收到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是&#34; root的名称空间&#34;根的名字是Dokument。

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

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

PHP可以获取这些信息吗?

2 个答案:

答案 0 :(得分:2)

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"

答案 1 :(得分:1)

您可以使用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的简单方法。