PHP DOMDocument всегда выдает пустой объект - PullRequest
0 голосов
/ 12 сентября 2011

Я пытаюсь загрузить простую строку HTML (которая вне зависимости от HTML-аккуратности) не разрешит доступ к DOMDocument.

Вот пример

    $doc = new DOMDocument(/*'1.0', 'utf-8'*/);
    $doc->recover = true;
    $doc->strictErrorChecking = false;
    $doc->formatOutput = true;
    $doc->load($content);

    $node_array = $doc->getElementsByTagName("body");
    print_r( $node_array) 

... или$node_array->items(0);

Я получаю:

DOMNodeList Object
(
)

DOMDocument прекрасно возвращает строку с функцией save. Это не ресурс.Может ли отсутствовать зависимости, дополнительные конфигурации PHP ...?

Обновление: В объектах DOMDocument просто не реализованы функции преобразования tostring:

    print_r( (string)$node_array );

Объект класса DOMNodeList не может быть преобразован в строку в ....


Код HTML находится здесь: http://pastebin.com/11V92Dup (намеренно искажено - это должно было продемонстрировать в коде, что 'tidy 'правильно закрывает теги)

Я хотел бы просто пройтись по узлам и вывести их содержимое:

    $node_array = $doc->getElementsByTagName("html");//parent_node();
    $x = $doc->documentElement;
    foreach ($x->childNodes AS $item)
      {
      print $item->nodeName . " = " . $item->nodeValue . "<br />";
      }

ОБНОВЛЕНИЕ 2: Я получил этот результат!что не имеет смысла.(откуда все пробелы?)

 body = 







                  COMPOUND: C05441

1 Ответ

0 голосов
/ 25 мая 2012

Я не совсем понимаю, что вы ожидаете от ответа. Я все равно попробую. Вот некоторый код, который рекурсивно перебирает ваше HTML-дерево и выводит значение textContent каждого элемента.

<?php

$contents = <<<HTML
<html><head>
<title>KEGG COMPOUND: C05441</title>
<link type="text/css" rel="stylesheet" href="/css/gn2.css">
<link rel="stylesheet" href="/css/bget.css" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
</head>
<body onload="window.focus();init();" bgcolor="#ffffff">
<table border=0 cellpadding=0 cellspacing=0><tr><td>
<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td width="70"><a href="/kegg/kegg2.html"><img align="middle" border="0" src="/Fig/bget/kegg2.gif" alt="KEGG"></a></td><td>&nbsp;&nbsp;&nbsp;</td><td><a name="compound:C05441"></a><font class="title2">COMPOUND: C05441</font></td><td align="right" valign="bottom"><a href="javascript:void(window.open('/kegg/document/help_bget_compound.html','KEGG_Help','toolbar=no,location=no,directories=no,width=720,height=640,resizable=yes,scrollbars=yes'))"><img onmouseup="btn(this,'Hb')" align="middle" onmouseout="btn(this,'Hb')" onmousedown="btn(this,'Hbd')" onmouseover="btn(this,'Hbh')" alt="Help" name="help" border="0" src="/Fig/bget/button_Hb.gif"></a></td></tr></table>
<form method="post" action="/dbget-bin/www_bget" enctype="application/x-www-form-urlencoded" name="form1">
<table border=0 cellpadding=1 cellspacing=0>
<tr>
<td class="fr2">
<table border=0 cellpadding=2 cellspacing=0 style="border-bottom:#000 1px solid">

</table>
</body></html>
HTML;

$doc = new DOMDocument("1.0", "UTF-8");
$doc->loadHTML($contents);

header("Content-Type: text/plain; charset=utf-8");

function recursivelyEchoChildNodes (DOMElement $parent, $depth = 1) {
    foreach ($parent->childNodes as $node) {
        if ($node instanceof DOMElement) {
            echo str_repeat("-", $depth) . " " . $node->localName . " = " . $node->textContent . "\n";
            if ($node->hasChildNodes()) {
                recursivelyEchoChildNodes($node, $depth + 1);
            }
        }
    }
}

$html = $doc->getElementsByTagName("html")->item(0);
recursivelyEchoChildNodes($html);
...