Как собрать фрагменты HTML в DOMDocument? - PullRequest
1 голос
/ 18 января 2011

Похоже, что loadHTML и loadHTMLFile для файлов, представляющих разделы HTML-документа, похоже, заполняют теги html и body для каждого раздела, как показано, когда я выводил следующее:

$doc = new DOMDocument();
$doc->loadHTMLFile($file);
$elements = $doc->getElementsByTagName('*');

if( !is_null($elements) ) {
    foreach( $elements as $element ) {
        echo "<br/>". $element->nodeName. ": ";

        $nodes = $element->childNodes;
        foreach( $nodes as $node ) {
            echo $node->nodeValue. "\n";
        }
    }
}

Поскольку я планирую собрать эти части в более крупный документ в своем собственном коде, и я получил указание использовать DOMDocument для этого, что я могу сделать, чтобы предотвратить такое поведение?

Ответы [ 2 ]

1 голос
/ 18 января 2011

Это часть нескольких модификаций, которые модуль синтаксического анализа HTML libxml вносит в документ для работы с поврежденным HTML. Это происходит только при использовании loadHTML и loadHTMLFile при частичной разметке. Если вы знаете, что частичное действительное значение X (HT) ML, используйте load и loadXML.

Вы можете использовать

$doc->saveXml($doc->getElementsByTagName('body')->item(0));

, чтобы вывести externalHTML элемента body, например <body>anything else</body> и удалите элемент body с помощью str_replace или извлеките внутренний html с помощью substr.

$html = '<p>I am a fragment</p>';
$dom = new DOMDocument;
$dom->loadHTML($html); // added html and body tags
echo substr(
    $dom->saveXml(
        $dom->getElementsByTagName('body')->item(0)
    ),
    6, -7
);
// <p>I am a fragment</p>

Обратите внимание, что при этом будет использоваться XHTML-совместимая разметка, поэтому <br> станет <br/>. Начиная с PHP 5.3.5, нет способа передать узел в saveHTML(). Был подан запрос об ошибке.

0 голосов
/ 18 января 2011

Самое близкое, что вы можете получить, это использовать DOMDocumentFragment.

Тогда вы можете сделать:

$doc = new DOMDocument();
...
$f = $doc->createDocumentFragment();
$f->appendXML("<foo>text</foo><bar>text2</bar>"); 
$someElement->appendChild($f);

Однако, это ожидает XML, а не HTML.

В любом случае, я думаю, что вы создаете искусственную проблему.Поскольку вы знаете, что нужно создать теги html и body, вы можете просто извлечь элементы в файле из тега body и затем импортировать их в DOMDocument, где вы собираете окончательный файл.См DOMDocument::importNode.

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