2009-07-30 1 views
11

У меня есть 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 из "теста", так что я могу назвать - например - hasChildNodes. Я могу получить «documentElement», но это DOMElement. Может быть, я могу идти оттуда?

$d = DOMDocument::loadXML($xml); 
// [... do some stuff here to find document's root node ...] 
if ($rootnode->hasChildNodes()) echo 'yayy!' 

Кто может заполнить промежуток? Кажется, я слепой.

(Очевидно, что это не только hasChildNodes, которые я хочу назвать - так что НЕТ, это не поможет найти другой метод, чтобы узнать, содержит ли документ материал. Это просто для моего простого примера. Мне нужен DOMNode в конце .)

+0

Хорошо, проблема заключается в полной путанице между «DOMDocument» и «DomDocument» между PHP5 и PHP4 и ее странной документацией. Думаю, теперь я это исправил. Спасибо всем. – BlaM

ответ

5

Согласно PHP документации DOMElement is a subclass of DOMNode, поэтому он должен наследовать hasChildNodes() -метод.

+0

Хммм, хорошо, на самом деле это правда ... И если я не присылаю свой -> documentElement к функции, все, кажется, работает правильно ... Вызов функции теряет что-то на своем пути ... Теперь, чтобы найти это ... – BlaM

12

DOM Model - W3C разбил DOM на древовидную структуру узлов различных типов. Интерфейс узла - это базовый интерфейс для всех элементов. Все объекты, реализующие этот интерфейс, выставляют методы для работы с детьми.

$dom=new DomDocument; 
$dom->Load("file.xml"); 
$root=$dom->documentElement; // Root node 
+0

Должен быть помечен как решение. – kaiser

55

DOMElement распространяется DOMNode.

Вы получаете RootDOMElement на $ d-> documentElement.

+12

На самом деле это должен быть тикающий ответ! –

+2

вот документация для этого свойства http://www.php.net/manual/en/class.domdocument.php#domdocument.props.documentelement – gawpertron

+0

Я буду кого-то сэкономить. В приведенной выше документации говорится: «Это атрибут удобства, который позволяет прямому доступу к дочернему узлу, являющемуся элементом документа документа». – Ben

0

До 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 Добавлено так Вопросы, которые я ударил, пытаясь найти, как это сделать до 5.1.3