Как выбрать 2-й элемент с таким же тегом, используя dom xpath?

У меня есть макет, как это:

<div class="fly">
<img src="a.png" class="badge">
<img class="aye" data-original="b.png" width="130" height="253" />
<div class="to">
<h4>Fly To The Moon</h4>
<div class="clearfix">
<div class="the">
<h4>**Wow**</h4>
</div>
<div class="moon">
<h4>**Great**</h4>
</div>
</div>
</div>
</div>

Сначала я получаю запрос из xpath:

$a = $xpath->query("//div[@class='fly']""); //to get all elements in class fly
foreach ($a as $p) {
$t = $p->getElementsByTagName('img');
echo ($t->item(0)->getAttributes('data-original'));
}

Когда я запускаю код, он выдаст 0 результатов. После того, как я проследил, я обнаружил, что <img class="badge"> обрабатывается первым. Я хочу спросить, как я могу получить исходное значение данных из <img class="aye">а также получить значениеВот это да» а также «большой» от <h4> тег?

Спасибо,

0

Решение

С другой стороны, вы можете использовать другой xpath-запрос для добавления текущего кода.

Чтобы получить атрибут, используйте ->getAttribute():

$dom = new DOMDocument();
$dom->loadHTML($markup);
$xpath = new DOMXpath($dom);
$parent_div = $xpath->query("//div[@class='fly']"); //to get all elements in class fly

foreach($parent_div as $div) {
$aye = $xpath->query('./img[@class="aye"]', $div)->item(0)->getAttribute('data-original');
echo $aye . '<br/>'; // get the data-original
$others = $xpath->query('./div[@class="to"]/div[@class="clearfix"]', $div)->item(0);
foreach($xpath->query('./div/h4', $others) as $node) {
echo $node->nodeValue . '<br/>'; // echo the two h4 values
}
echo '<hr/>';
}

Пример вывода

1

Другие решения

Спасибо за ваш код!

Я пробую код, но он терпит неудачу, я не знаю почему. Итак, я немного изменяю ваш код, и он работает!

$dom = new DOMDocument();
$dom->loadHTML($markup);
$xpath = new DOMXpath($dom);
$parent_div = $xpath->query("//div[@class='fly']"); //to get all elements in class fly

foreach($parent_div as $div) {
$aye = $xpath->query('**descendant::**img[@class="aye"]', $div)->item(0)->getAttribute('data-original');
echo $aye . '<br/>'; // get the data-original
$others = $xpath->query('**descendant::**div[@class="to"]/div[@class="clearfix"]', $div)->item(0);
foreach($xpath->query('.//div/h4', $others) as $node) {
echo $node->nodeValue . '<br/>'; // echo the two h4 values
}
echo '<hr/>';
}

Я понятия не имею, в чем разница между ./ а также descendant но мой код работает нормально, используя descendant,

1

учитывая следующий XML:

<div class="fly">
<img src="a.png" class="badge">
<img class="aye" data-original="b.png" width="130" height="253" />
<div class="to">
<h4>Fly To The Moon</h4>
<div class="clearfix">
<div class="the">
<h4>**Wow**</h4>
</div>
<div class="moon">
<h4>**Great**</h4>
</div>
</div>
</div>
</div>

вы спрашивали:

как я могу получить data-original значение от <img class="aye">а также получить значения «Wow» и «Great» из <h4> тег?

С XPath вы можете получить значения в виде строки напрямую:

string(//div[@class='fly']/img/@data-original)

Это строка из первого атрибута data-original тега img во всех элементах div с class = «fly».

string(//div[@class='fly']//h4[not(following-sibling::*//h4)][1])
string(//div[@class='fly']//h4[not(following-sibling::*//h4)][2])

Это строковые значения первого и второго <h4> тег, за которым на его уровне не следует другой <h4> пометить во всех div class="fly",

Это выглядит как стоящее на пути прямо сейчас, но с итерацией те части впереди больше не понадобятся, потому что xpath будет относительным:

//div[@class='fly']
string(./img/@data-original)
string(.//h4[not(following-sibling::*//h4)][1])
string(.//h4[not(following-sibling::*//h4)][2])

Использовать xpath string(...) выражения в PHP вы должны использовать DOMXPath::evaluate() вместо DOMXPath::query(), Это будет выглядеть следующим образом:

$aye  = $xpath->evaluate("string(//div[@class='fly']/img/@data-original)");
$h4_1 = $xpath->evaluate("string(//div[@class='fly']//h4[not(following-sibling::*//h4)][1])");
$h4_2 = $xpath->evaluate("string(//div[@class='fly']//h4[not(following-sibling::*//h4)][2])");

Полный пример с итерацией и выводом:

// all <div> tags with class="fly"$divs = $xpath->evaluate("//div[@class='fly']");

foreach ($divs as $div) {

// the first data-original attribute of an <img> inside $div
echo $xpath->evaluate("string(./img/@data-original)", $div), "<br/>\n";

// all <h4> tags anywhere inside the $div
$h4s = $xpath->evaluate('.//h4[not(following-sibling::*//h4)]', $div);

foreach ($h4s as $h4) {
echo $h4->nodeValue, "<br/>\n";
}
}

Как показано в примере, вы также можете использовать оценку для списков узлов. Получение ценностей от всех <h4> теги это не с string() Я полагаю, больше, чем два.

Демонстрация в Интернете, включая вывод специальной строки (только пример):

echo <<<HTML
{$xpath->evaluate("string(//div[@class='fly']/img/@data-original)")}<br/>
{$xpath->evaluate("string(//div[@class='fly']//h4[not(following-sibling::*//h4)][1])")}<br/>
{$xpath->evaluate("string(//div[@class='fly']//h4[not(following-sibling::*//h4)][2])")}<br/>
<hr/>
HTML;
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector