2015-11-27 9 views
2

Я получаю XML как:Получить 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"> 
... 

Мой вопрос - Как я могу получить пространство имен корня? Над моим корневым узлом является wnio: Dokument, и я знаю, что wnio - это «пространство имен root», а имя root - Dokument.

Но имя и пространство имен могут быть изменены. Тогда у меня будет корневой узел, но я бы не знал пространства имен и имя root.

Я использовал до сих пор: SimpleXMLElement :: getNamespaces и SimpleXMLElement :: getDocNamespaces. Но я получил каждое пространство имен, но я не знаю, что такое root.

Возможно, на PHP можно получить эту информацию?

ответ

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" 
+0

простой информация и работы. спасибо –

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.

+1

Этот ответ полезно тоже. Обратите внимание, что вместо loadXml вы использовали load - мы всегда получаем false. –

Смежные вопросы