PHP5: найти корневой узел в DOMDocument
У меня есть PHP5 DOMDocument, и я пытаюсь найти корневой узел (не корневой элемент).
Пример:
<test>
<element>
<bla1>x</bla1>
<bla2>x</bla2>
</element>
<element>
<bla1>y</bla1>
<bla2>y</bla2>
</element>
<element>
<bla1>z</bla1>
<bla2>z</bla2>
</element>
</test>
Я хочу получить DOMNode "test", чтобы я мог вызвать, например, hasChildNodes. Я могу получить "documentElement", но это DOMElement. Может быть, я могу пойти оттуда?
$d = DOMDocument::loadXML($xml);
// [... do some stuff here to find document's root node ...]
if ($rootnode->hasChildNodes()) echo 'yayy!'
Кто может заполнить пробел? Кажется, я слепой.
(Очевидно, это не только hasChildNodes, которые я хочу вызвать - так что НЕТ, это не помогает найти другой метод, чтобы выяснить, содержит ли документ материал. Это только для моего простого примера. Мне нужен DOMNode в конце.)
4 ответа
Согласно PHP документам DOMElement является подклассом DOMNode, поэтому он должен наследовать hasChildNodes()
-метод.
DOMElement расширяет DOMNode.
Вы получаете корневой DOMElement с помощью $d->documentElement.
Модель DOM - W3C разбил DOM на древовидную структуру узлов разных типов. Интерфейс Node является базовым интерфейсом для всех элементов. Все объекты, реализующие этот интерфейс, предоставляют методы для работы с детьми.
$dom=new DomDocument;
$dom->Load("file.xml");
$root=$dom->documentElement; // Root node
До php 5.1.3 этот парень вылизал
https://macfoo.wordpress.com/2009/06/03/getting-the-root-node-from-an-xml-string
/**
* function getXMLRootNode
* @param string An xml string
* @return string Return XML root node name
*/
function getXMLRootNode($xmlstr)
{
// Create DOM model
$doc = new DOMDocument();
// Load the XML string
if(!$doc->loadXML($xmlstr))
{
throw new Exception('Unable to parse XML string');
}
// Find the root tag name
$root = $doc->documentElement;
if(!isset($root))
{
throw new Exception('Unable to find XML root node');
}
if(!isset($root->nodeName))
{
throw new Exception('Unable to find XML root node name');
}
return $root->nodeName;
}
Cross Отправлено в SO Вопросы, которые я задавал, пытаясь найти, как это сделать до 5.1.3