2015-06-03 15 views
1

Если у меня есть XML, например, как это:дочерние узлы DOM XML

<?xml version="1.0" encoding="utf-8" ?> 
    <parent > 
    <child> 
     <grandchild> 
     </grandchild> 
    </child> 
    </parent> 

И я хочу, чтобы все дети родительского узла (с использованием PHP, например), , когда я называю

$xmlDoc->loadXML('..'); 

$rootNode = $xmlDoc->documentElement; 

$children = $rootNode->childNodes; 

Что будет $children? Будет ли он содержать только <child> узел ot будет содержать <child> и <grandchild> оба?

+0

Попробуйте и посмотрите ... [здесь, например] (https://eval.in/374902): Он содержит 3 узла, ребенка и внука, а его содержимое (текст) –

+0

Мой вывод из дампа: 'Вывод объекта (DOMNodeList) # 3 (1) {[" length "] => int (1)}' в eclipse и PHP 5.5. Тогда это означает, что он получает только '' узел. Не так ли? –

+0

'foreach ($ rootNode-> childNodes as $ node) {echo $ node-> tagName, PHP_EOL; } 'скажет вам, что другие свойства, на которые вы можете положиться, включают' nodeName' и 'nodeType' ... [см. руководство] (http://php.net/manual/en/class.domnode.php) –

ответ

1

Узел элемента документа parent имеет 3 дочерних узла. Узел child элемента и два текстовых узлов до и содержащих пробельные после узла:

$document = new DOMDocument(); 
$document->loadXml($xml); 
foreach ($document->documentElement->childNodes as $childNode) { 
    var_dump(get_class($childNode)); 
} 

Выхода:

string(7) "DOMText" 
string(10) "DOMElement" 
string(7) "DOMText" 

Если отключить сохранение белого режима пространства на документе, он будет удалять пробела узлов при загрузке xml.

$document = new DOMDocument(); 
$document->preserveWhiteSpace = FALSE; 
$document->loadXml($xml); 
... 

Выход:

string(10) "DOMElement" 

Чтобы получить узлы в более гибкий способ использования Xpath. Это позволяет использовать выражения для извлечения узлов:

$document = new DOMDocument(); 
$document->loadXml($xml); 
$xpath = new DOMXpath($document); 

foreach ($xpath->evaluate('/*/child|/*/child/grandchild') as $childNode) { 
    var_dump(get_class($childNode), $childNode->localName); 
} 

Выход:

string(10) "DOMElement" 
string(5) "child" 
string(10) "DOMElement" 
string(10) "grandchild" 
Смежные вопросы