Как я могу получить сериализованный HTML-код элемента с помощью PHP DOMDocument?

Это мой пример сценария:

$html = <<<HTML
<div class="main">
    <div class="text">
    Capture this text 1
    </div>
    <div class="date">
    May 2010
    </div>
</div>
<div class="main">
    <div class="text">
    Capture this text 2
    </div>
    <div class="date">
    June 2010
    </div>
</div>
HTML;

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

$xpath = new DOMXPath($dom);


$tags = $xpath->query('//div[@class="main"]');
foreach ($tags as $tag) {
    print_r($tag->nodeValue."\n");
}

Это выведет:

Capture this text 1 May 2010
Capture this text 2 June 2010 

Но мне нужен вывод:

<div class="text">
Capture this text 2
</div>
<div class="date">
June 2010
</div>

Или, по крайней мере, сделать что-то подобное в моем цикле foreach:

$text = $tag->query('//div[@class="text"]')->nodeValue;
$date = $tag->query('//div[@class="date"]')->nodeValue;

person benjovanic    schedule 27.09.2010    source источник
comment
Этот вопрос касается не выражения XPath, а конкретных методов реализации DOM.   -  person    schedule 27.09.2010


Ответы (2)


Ну, nodeValue даст вам значение узла. Вы хотите то, что обычно называют outerHTML

echo $dom->saveXml($tag);

выведет то, что вы ищете, в соответствии с X(HT)ML.


Начиная с PHP 5.3.6 вы также можете передать узел saveHtml, , что раньше было невозможно. :

echo $dom->saveHtml($tag);

Последний будет подчиняться синтаксису HTML4. Спасибо Artefacto за это.

person Gordon    schedule 27.09.2010
comment
Объедините это с небольшим количеством ответа JapanPro относительно innerHTML, и мы могли бы получить $result = '';foreach($tag->childNodes as $tag) $result.=$dom->saveXML($tag); с исходным XPath. - person Wrikken; 27.09.2010

попробуйте это

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

$xpath = new DOMXPath($dom);

$tags = $xpath->query('//div[@class="main"]');

foreach ($tags as $tag) {
    $innerHTML = '';

    $children = $tag->childNodes;
    foreach ($children as $child) {
        $tmp_doc = new DOMDocument();
        $tmp_doc->appendChild($tmp_doc->importNode($child,true));       
        $innerHTML .= $tmp_doc->saveHTML();
    }

    var_dump(trim($innerHTML));
}

-Паскаль МАРТИН

person Pramendra Gupta    schedule 27.09.2010
comment
почему проголосовали против, без тестирования кода. оставьте отзыв, пока голосуете против. - person Pramendra Gupta; 27.09.2010
comment
Почему его приписывают Паскалю Мартину? Вы получили код из одного из его ответов? - person alex; 13.03.2011
comment
@Pascal Я думаю, что копирование и вставка ответов других пользователей здесь не рекомендуется. - person alex; 13.03.2011
comment
@alex, кажется, в значительной степени основан на части ответа, который я дал там: stackoverflow.com/q/2574625/138475 (мне пришлось удалить/повторно опубликовать свой комментарий, чтобы немного его отредактировать) - person Pascal MARTIN; 13.03.2011