Атрибуты DOMDocument xmlns - как их получить? - PullRequest
2 голосов
/ 09 июня 2011

Я использую DOMDocument для чтения XML (SVG), в котором есть пространства имен. Я перебираю атрибуты всех узлов, но не могу получить атрибуты типа «xmlns» корневого элемента.

XML выглядит так:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

   id="svg2"
   sodipodi:version="0.32"
   inkscape:version="0.48.1 "
   viewBox="0,0 534,616"

   ...
>

Когда я пытаюсь что-то сделать, вот так:

$node= DOMDocument->documentElement;
foreach($node->attributes as $attribute) {
  echo $attribute->nodeName."\n";
}

Я получаю «другие» атрибуты, такие как id, viewBox и т. Д., Но не xlmns: dc и т. Д.

Есть ли способ получить их тоже?

Ответы [ 2 ]

1 голос
/ 19 февраля 2013

Если вы анализируете документ, извлекая префиксы пространства имен из каждого значения атрибута, а затем используя DOMNode::lookupNamespaceURI (префикс строки $) для построения сопоставлений префикса-uri, это приведет к меньшим издержкам, чем при использовании simplexml.

1 голос
/ 09 июня 2011

Попробуйте с namespaceURI

URI пространства имен этого узла или NULL, если он не указан.

Чтобы получить пространство имен по умолчаниюURI корневого узла, вы используете

$dom->documentElement->namespaceURI;

демо

См. Мой ответ в связанном дубликате о том, как получить все атрибуты пространства имен.

Альтернативой этому было бы использование XPath:

$xpath = new DOMXPath($dom);
foreach ($xpath->query('namespace::*', $context) as $node) {
    echo $node->nodeValue;
}

демо

...