PHP DOMDocument loadHTML возвращает два дочерних узла HTML - PullRequest
0 голосов
/ 07 марта 2019

Я использую PHP в Visual Studio и пытался перешагнуть через различные узлы в строке HTML.Я загрузил строку в DOMDocument, используя loadHTML, и извлек firstChild из документа, проверил, что это был узел HTML, но у узла не было дочерних элементов.

Затем я изменил код, чтобы перешагнуть все дочерние узлыдокумент и, к моему удивлению, вернул два HTML-узла, второй из которых имеет ожидаемые дочерние узлы.Это то, что я должен ожидать, и кто-нибудь может объяснить, почему?

Код и вывод прилагаются.

enter code here
<?php
$html = '<html><head></head><body>';
$html .= '<h1>Content 1</h1><h2>Content 1.1</h2><h3>Content 1.1.1</h3>';
$html .= '</body></html>';

define ('NEWLINE',"\r\n" );

function recurceHTML ($node, $spaces)
{
    $nextIndent = $spaces . '  ';
    print ($spaces . $node->nodeName . NEWLINE);
    foreach($node->childNodes as $childNode)
    {
        recurceHTML ($childNode, $nextIndent);
    }
}


$dom = DOMDocument::loadHTML($html);
$spaces = '  ';

foreach ($dom->childNodes as $child)
{
    recurceHTML ($child, $spaces);
}
$wait = readline();
?>

Вывод сверху:

  html
  html
    head
    body
      h1
        #text
      h2
        #text
      h3
        #text

1 Ответ

1 голос
/ 07 марта 2019

С небольшим обновлением вашего кода, чтобы более четко показать содержимое, которое он использует, вы можете видеть, откуда поступают данные ...

function recurceHTML ($node, $spaces)
{
    $nextIndent = $spaces . '  ';
    print ($spaces . $node->nodeName."->".$node->nodeType . NEWLINE);

    if ( $node->nodeType == 1 ) {
        foreach($node->childNodes as $childNode)
        {
            recurceHTML ($childNode, $nextIndent);
        }
    }
}

$dom = new DOMDocument();
$dom->loadHTML($html);
$spaces = '  ';

echo $dom->saveHTML().PHP_EOL;

foreach ($dom->childNodes as $child)
{
    recurceHTML ($child, $spaces);
}

Первый echo показывает фактический документ, с которым он работает ...

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head></head><body><h1>Content 1</h1><h2>Content 1.1</h2><h3>Content 1.1.1</h3></body></html>

Как вы можете видеть - в документе также указан тип документа.

Тогда у вас есть вывод основной функции ...

  html->10
  html->1
    head->1
    body->1
      h1->1
        #text->3
      h2->1
        #text->3
      h3->1
        #text->3

Выходные данные после tagName показывают тип узла , первый - 10, который является DOMDocumentType (<!DOCTYPE html PUBLIC "-//W3...), затем второй тип 1, который XML_ELEMENT_NODE, который является вашим <html> тегом.

Поскольку вы используете loadHTML - это всегда будет пытаться создать действительный документ HTML - это включает в себя добавление типа документа, а также тегов <html> и т. Д., Которые понадобятся на обычной странице HTML.

...