PHP: «Не удалось получить элемент DOME. Узел больше не существует в» с использованием DOMXpath - PullRequest
1 голос
/ 20 марта 2020

У меня есть HTML, который содержит это:

<div class="test">
  Outer
  <div class="test">Inner 1</div>
  <div class="test">Inner 2</div>
</div>

Я делаю str_replace() для содержимого этих элементов:

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);

foreach($xpath->query("//div[@class='test']") as $node) {
    $node->nodeValue = str_replace(" ", "X", $node->nodeValue);
}

Это должно заменить любые пробелы с "X".

Но это приводит к этой ошибке:

Предупреждение: Не удалось получить элемент DOMElement. Узел больше не существует в / path / to / my / file. php в строке 63

Это работает, если есть только один вложенный div:

<div class="test">
  Outer
  <div class="test">Inner 1</div>
</div>

Почему это происходит и как я могу заставить его работать?

1 Ответ

1 голос
/ 21 марта 2020

Попробуйте изменить

foreach($xpath->query("//div[@class='test']") as $node) 

на

foreach($xpath->query('//div[@class="test"]//div[@class="test"]') as $node)

Редактировать по комментариям:

Предполагая, что во внешнем элементе есть пробел (то есть его "Наружный 1": ):

<?php
$string = <<<XML
<div class="test">
  Outer 1
  <div class="test">Inner 1</div>
  <div class="test">Inner 2</div>
</div>
XML;
$dom = new DOMDocument();
$dom->loadHTML($string);
$xpath = new DOMXpath($dom);

foreach($xpath->query('//div[@class="test"]//text()') as $node) {
   $nnode = trim($node->nodeValue);

   echo $nnode  = str_replace(" ", "X", $nnode);
}
...