DOMNode-›ChildNodes-›length возвращает неверное значение

У меня есть PHP-скрипт, который анализирует веб-страницу и перемещается по ней с помощью библиотек DOMDocument и DOMXpath. При запуске $tr->ChildNodes->length для получения 3 <td> инструкция возвращает 6, где 0 возвращает первое <td>, 1 — пустая строка (19), 2 — второе <td>, 3 — снова пустая строка (19), 4 — третье <td>, 5 — это еще раз пустая строка (19), а 6 — это весь HTML-код страницы. (проверено с использованием $dom->saveHTML($tr->childNodes->item(0) и т. д.) Как заставить ->length возвращать правильный номер? Почему он так странно себя ведет?

<tr>
  <td>
    <span>...</span>
  </td>
  <td>
    <a href="..."><img ...></a>
  </td>
  <td>
    <div>
    <span>
      <a href="...">...</a>
      <br>
      <ahref="...">...</a>
    </span>
    <span>...</span>
    <br><br>
    <a href="...">...</a>, <a href="...">...</a>
    </div>
    <div>
      <a href="...">...</a> | <a href="...">...</a>
    </div>
  </td>
</tr>

Обратите внимание, что я пропустил некоторые атрибуты, такие как стиль, класс, данные и т. д.


person plumbe0    schedule 12.02.2015    source источник


Ответы (1)


Такое поведение не совсем "странно". В DOM разрывы строк фактически рассматриваются как пустые узлы. Чтобы получить «правильное» количество дочерних элементов, вы должны либо заранее удалить разрывы строк из документа, который вы пытаетесь проанализировать, либо получить все дочерние элементы и удалить пустые элементы из этого списка узлов.

person breln    schedule 12.02.2015
comment
Спасибо за информацию. Но разве $dom->preserveWhiteSpace = false не помогает удалить ненужные пробелы? - person plumbe0; 12.02.2015
comment
Думаю, в вашем случае это бесполезно. Это помогает сохранить отступы элементов в коде, и здесь вы имеете дело не с пробелами, а с символами новой строки. Так что вам лучше просто перебрать список узлов и $tr->removeChild() пустые элементы - person breln; 12.02.2015