2011-09-12 2 views
0

Я пытаюсь загрузить простую HTML-строку (которая независимо от HTML-tidy) не позволит доступ к DOMDocument.PHP 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 возвращает строку просто отлично с функцией сохранения Это не ресурс , Могут ли они отсутствовать зависимости, дополнительные конфигурации PHP ...?

Update: Объектами 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 />"; 
     } 

UPDATE 2: я получаю этот результат! что не имеет смысла. (Где же все пробелы взялось?)

body = 







        COMPOUND: C05441 
+0

Где ваша строка HTML? – ajreal

+0

Извините, но какой вопрос? Вы хотите получить все тело как строку? если это правда, и вы хотите сделать это с помощью DOMDocument, вы должны клонировать первый узел и вставлять его в новый DOMDocument. Например: $ node_arr = $ doc-> getElemenetsByTagName ('body'); if ($ node_arr-> length) {$ new_dom = новый DOMDocument; $ New_dom-> AppendChild ($ node_arr-элементы (0) -> cloneNode (истина))}. Но IU советуют гораздо лучше использовать sunstring/strpos или regexp. – ZigZag

+0

Белые пространства вызывают теги HTML под тегом body. Что вы ищете? – ajreal

ответ

0

Я не совсем ясно, на что вы ждете ответа. Я все равно попробую. Ниже приведен код, который рекурсивно выполняет итерацию над вашим деревом 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);