2015-08-07 1 views
-2

Я хочу, чтобы выбрать потомок текущего узла сНа и сохранить их в переменный:Xpath как выбрать детей?

<div id="summary"> 
<p>aaaaaaa</p> 
<p>bbbbbbb</p> 
<br> 
<p>ccccccc</p> 
<a></a> 
<p>ddddddd</p> 
</div> 

Я попытался

$summary = $dom->saveHTML($xpath->query('//div[@id="summary"]/child::*')->item(0)); 

Но это возвращает только первый P тег, который очень странно для меня причина " * 'должен получить всех детей, поэтому, где я могу исправить его, чтобы выбрать всех детей, а не только первый?

+1

Почему это заканчивается символом '-> item (0)'? Похоже, это преступник. – pritaeas

+0

@pritaeas Причина saveHTML требует, чтобы элемент rahter, чем nodelist, передавался в – user7031

+0

@ user7031: у вас, скорее всего, есть [проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the- xy-problem) здесь. – hakre

ответ

1

Два виновника - это saveHTML и "-> item (0)". Запрос возвращает массив значений, и вы можете получить доступ к каждому элементу через цикл foreach.

<?php 
$content = 
'<div id="summary"> 
<p>aaaaaaa</p> 
<p>bbbbbbb</p> 
<p>ccccccc</p> 
<a></a> 
<p>ddddddd</p> 
</div>'; 
$xml = new SimpleXMLElement($content); 


$entries = $xml->xpath('//div[@id="summary"]/child::*'); 
foreach ($entries as $entry) { 
    echo $entry; 
} 
?> 

Я удалил перерыв для хорошо сформированного примера. В приведенном выше коде $ entries содержит массив всех соответствующих значений (aaaaaaa через ddddddd). «item (0)» обращается к первому элементу массива. Ваш Xpath правильный, но использование этих двух функций неверно. Вопрос в том, хотите ли вы назначить переменную или сериализовать результат?

saveHTML сбрасывает документ, созданный с помощью «createElement» в строку. Сохранение информации в переменной действительно просто, как назначение ей.

+0

Я думал, что инструкция child вернет всех детей в целом, и это было неправильно, есть ли какой-либо метод, который может вернуть детей как единое целое, а не нодлист? – user7031

+0

Другими словами, хотелось бы сохранить тег, другие метаданные и значение вокруг детей через некоторое время, а не просто захватить значение? Если это так, вы будете искать в инструменте _Regular Expression_, таком как preg_match(), вместо запросов Xpath. – ExternCowWindows