Почему я получаю (значение объекта опущено) при попытке найти атрибут узла? - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть HTML-файл, и я пытаюсь использовать DOM, чтобы найти атрибут id всех <h2> элементов:

$html = new DOMDocument;
$html->loadHTML($file);
$headings = $html->getElementsByTagName('h2');

Что, как и ожидалось, возвращает DOMNodeList с числом, равным количеству заголовков в моем документе. Когда я повторяю это и пытаюсь исследовать данные, возвращенные через var_dump или print_r, я получаю ошибку (значение объекта опущено) для списка атрибутов:

object(DOMElement)#10 (18) {
  ["tagName"]=&gt;
  string(2) "h2"
  ["schemaTypeInfo"]=&gt;
  NULL
  ["nodeName"]=&gt;
  string(2) "h2"
  ["nodeValue"]=&gt;
  string(10) "What next?"
  ["nodeType"]=&gt;
  int(1)
  ["parentNode"]=&gt;
  string(22) "(object value omitted)"
  ["childNodes"]=&gt;
  string(22) "(object value omitted)"
  ["firstChild"]=&gt;
  string(22) "(object value omitted)"
  ["lastChild"]=&gt;
  string(22) "(object value omitted)"
  ["previousSibling"]=&gt;
  string(22) "(object value omitted)"
  ["nextSibling"]=&gt;
  string(22) "(object value omitted)"
  ["attributes"]=&gt;
  string(22) "(object value omitted)"
  ["ownerDocument"]=&gt;
  string(22) "(object value omitted)"
  ["namespaceURI"]=&gt;
  NULL
  ["prefix"]=&gt;
  string(0) ""
  ["localName"]=&gt;
  string(2) "h2"
  ["baseURI"]=&gt;
  NULL
  ["textContent"]=&gt;
  string(10) "What next?"
}

Почему это так и почему я не могу увидеть количество атрибутов или почему DOMNamedNodeMap не возвращается, как документация говорит, что так и должно быть?

Я пытался использовать xPath вместо функции getElementsByTagName, но у меня возникла та же проблема.

Как мне получить атрибуты? Я не вижу способа сделать это?

1 Ответ

0 голосов
/ 03 сентября 2018

Хотя в документации указано, что

  • getElementsByTagName возвращает DOMNodeList ( getElementsByTagName )
  • Итерация по элементам DOMNodeList возвращает DOMNode ( DOMNodeList )

Фактические возвращенные предметы не DOMNodes, а DOMElements (что расширяет первое).


Использование var_dump() или print_r() для этих элементов по-прежнему дает строку (значение объекта опущено), однако это не является сообщением об ошибке. У DOMElements есть метод getAttribute(string $name), который вы можете вызвать для получения атрибута:

$html = new DOMDocument;
$html->loadHTML($file);
$headings = $html->getElementsByTagName('h2');
    foreach ($headings as $heading) {
            echo($heading->getAttribute('id'));
        }

Это работает и печатает идентификаторы всех заголовков двух тегов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...