Как я могу исправить эту проблему с отступом в DOMDocument? - PullRequest
3 голосов
/ 20 апреля 2011

Я только начал использовать объект DOMDocument, так как хочу проанализировать загруженный файл HTML, а затем использовать его в качестве шаблона для моей cms.

Я загружаю HTML из файла и - для целей тестирования -сохраните его как новый HTML-файл, ничего не меняя.Проблема в том, что отступы испорчены.

Вот как выглядит мой HTML-файл:

<!DOCTYPE html>
<html>
    <head>
        <title>DOM Testpage</title>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <meta name="language" content="deutsch, de" />
    </head>
    <body>
        <div class="pageOverlay"></div>
        <div style="height:100px;"></div>
        <div id="LoginForm">
            <div id="LoginLogo">
                Here's some Text
                <br />
                And another Text with some German Umlauts: öäü ÖÄÜ ß and so on...
                <br />
            </div>
            <form method="post" action="">
                <!-- Here be dragons. And a nice comment -->
                <input type="text" name="cms_user" value="" class="InputText " data-defaultvalue="Username" title="Please enter your username." style="margin:0px 0px 20px 0px;" />
                <input type="password" name="cms_password" value="" class="InputText " data-defaultvalue="Password" title="Please enter your password." style="margin:0px 0px 20px 0px;" />
                <input type="checkbox" name="cms_remember_login" value="1" id="cms_remember_login" />
                <label for="cms_remember_login" style="line-height:14px; margin-left:5px;">Remember Login</label>
                <!-- Another comment
                This one's even
                longer -->
                <input type="submit" name="submitLogin" value="Login" />
            </form>
        </div>
    </body>
</html>

Часть PHP:

<?php
    $lo_dom = new DOMDocument();
    $lo_dom->loadHTMLFile("test.html");
    $lo_dom->saveHTMLFile("templates/test_neu.html");
?>

Когда я открываюновый HTML-файл, источник выглядит следующим образом:

<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>DOM Testpage</title><meta name="language" content="deutsch, de"></head><body>
        <div class="pageOverlay"></div>
        <div style="height:100px;"></div>
        <div id="LoginForm">
            <div id="LoginLogo">
                Here's some Text
                <br>
                And another Text with some German Umlauts: &ouml;&auml;&uuml; &Ouml;&Auml;&Uuml; &szlig; and so on...
                <br></div>
            <form method="post" action="">
                <!-- Here be dragons. And a nice comment -->
                <input type="text" name="cms_user" value="" class="InputText " data-defaultvalue="Username" title="Please enter your username." style="margin:0px 0px 20px 0px;"><input type="password" name="cms_password" value="" class="InputText " data-defaultvalue="Password" title="Please enter your password." style="margin:0px 0px 20px 0px;"><input type="checkbox" name="cms_remember_login" value="1" id="cms_remember_login"><label for="cms_remember_login" style="line-height:14px; margin-left:5px;">Remember Login</label>
                <!-- Another comment
                This one's even
                longer -->
                <input type="submit" name="submitLogin" value="Login"></form>
        </div>
    </body></html>

Я уже пробовал установить preserveWhiteSpace и formatOutput, но это ничего не меняет.

Это не имеет большого значения длявсе, но было бы неплохо, если бы вывод выглядел как ввод.

Есть идеи, как это исправить?

И еще один вопрос: есть ли способ вручную вставить \nразрыв строки после того, как я добавил еще один узел с appendChild()?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

Правильный способ переформатирования документа с использованием DOM:

$dom = new DOMDocument();
$dom->preserveWhiteSpace = FALSE;
$dom->loadHTMLFile("test.html");
$dom->formatOutput = TRUE;
$dom->saveHTMLFile("templates/test_neu.html");

Если это не приводит к желаемому выводу, вы все равно можете добавить пробел самостоятельно.Любые пробелы, используемые для форматирования, являются DOMText узлами.См. Мои ответы

для более подробного объяснения.Альтернативой этому было бы использование Tidy для переформатирования кода или любого из инструментов, предложенных в https://stackoverflow.com/search?q=html+beautifier+php

0 голосов
/ 15 октября 2016

Столкнулся с этим вопросом, когда искал решение для отступа вывода XSLTProcessor.Вот изящный альтернативный подход, который может сэкономить кому-то время:

$xml -> preserveWhiteSpace = false;
$xml -> formatOutput = true;

$html = $xml -> saveXML();
$html = strstr( $html, '<html' );

file_put_contents( 'output.html', $html );

Любая другая конфигурация не сработала, для меня в любом случае.

...