Я получаю 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 — это «пространство имен root», а имя root — Dokument.
Но имя и пространство имен можно изменить. Тогда у меня будет корневой узел, но я не знаю пространства имен и имени root.
Я использовал до сих пор: SimpleXMLElement :: getNamespaces и SimpleXMLElement :: getDocNamespaces. Но я получил каждое пространство имен, но я не знаю, какой root.
Возможно ли в 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]
Это простой способ получить корневой элемент в качестве элемента DOME.