Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: X технологии > Проблема с форматированием вывода DOM


Автор: Resident 18.10.2008, 02:33
Есть документ XHTML следующего содержания:

Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xml:lang="ru" lang="ru" xmlns="http://www.w3.org/1999/xhtml">
<head>

<meta name="description" content="description" />
<meta name="keywords" content="keywords" />
</head>
<body>
  ....
</body>
</html>


Я загружаю его в DOM:

Код

$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadHTML($html);
echo $dom->saveHTML();


И на выходе вместо:
Код

<meta name="description" content="description" />
<meta name="keywords" content="keywords" />


Я получаю:
Код

<meta name="description" content="description">
<meta name="keywords" content="keywords">


И после этого валидатор начинает ругаться на эти и аналогичные одиночные, незакрытые дескрипторы вроде <br> вместо <br /> и т.д.

Подскажите пожалуйста как можно выйти из такой ситуации и заставить DOM генерировать HTML согласно DTD?

Автор: Serkys 19.10.2008, 08:09
Ну так ты ведь сам сказал "дай мне HTML, а не XML" smile
Код

echo $dom->saveHTML();

Замени на
Код

echo $dom->saveXML();

Автор: Resident 22.10.2008, 12:09
Пробывал я уже saveXML() вместо saveHTML(), но проблемы это не решило. Сайт на выходе отображался некорректно, тогда как при использовании метода saveHTML() все отображалось нормально. Может это из-за того, что код не проходит валидацию XHTML?

Автор: bars80080 22.10.2008, 13:06
возможно при saveXML() на выходе добавляется <?xml ?> в начало?

Автор: sTa1kEr 28.10.2008, 02:30
Во первых у вас вообще отсутствует декларация XML документа ('тег <?xml?>')
А во вторых нужно вызывать не только метод saveXML(), но и loadXML()
Код

$xml = '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xml:lang="ru" lang="ru" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="description" content="description" />
<meta name="keywords" content="keywords" />
</head>
<body>
  ....
</body>
</html>';
$dom = new DOMDocument();
$dom->loadXML($xml);
echo $dom->saveXML();

Автор: Resident 28.10.2008, 13:47
Цитата(bars80080 @ 22.10.2008,  13:06)
возможно при saveXML() на выходе добавляется <?xml ?> в начало?

Не добавляется.

Цитата(sTa1kEr @ 28.10.2008,  02:30)
Во первых у вас вообще отсутствует декларация XML документа ('тег <?xml?>')
А во вторых нужно вызывать не только метод saveXML(), но и loadXML()
Код

$xml = '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xml:lang="ru" lang="ru" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="description" content="description" />
<meta name="keywords" content="keywords" />
</head>
<body>
  ....
</body>
</html>';
$dom = new DOMDocument();
$dom->loadXML($xml);
echo $dom->saveXML();


Насколько мне известно для XHTML объявление декларации XML документа не требуется. Во всяком случае валидатор за это ничего не писал. Подставил строку "<?xml version="1.0" encoding="windows-1251"?>" в самом начале документа. Делаю $dom->loadXML($xml) $dom->saveXML() и на выходе почему то получаю не весь документ, а одну эту строку.

Автор: sTa1kEr 28.10.2008, 15:14
Цитата(Resident @  28.10.2008,  14:47 Найти цитируемый пост)
Насколько мне известно для XHTML объявление декларации XML документа не требуется.

Зато для XML требуется.

Цитата(Resident @  28.10.2008,  14:47 Найти цитируемый пост)
Во всяком случае валидатор за это ничего не писал.

При чем тут валидатор? Валидатор не имеет никакого отношения к парсингу.
Парсите вы XML документ, значит и соответствовать он должен всем стандартам XML.

Цитата(Resident @  28.10.2008,  14:47 Найти цитируемый пост)
и на выходе почему то получаю не весь документ, а одну эту строку.

Привидите сам код, который не работает.

[telepathy]Вы не перепутали случаем названия переменных с контентом? В моем пример это $xml, а в вашем $html[/telepathy]

Автор: Resident 1.11.2008, 04:07
Цитата(sTa1kEr @ 28.10.2008,  15:14)

    
Цитата(Resident @  28.10.2008,  14:47 Найти цитируемый пост)
и на выходе почему то получаю не весь документ, а одну эту строку.

    Привидите сам код, который не работает.

Приведенный вами пример работает как положено, но если использовать xml с главной страници сайта http://www.thehack.ru/ , то вылетает куча варнингов и отображается только <?xml version="1.0" encoding="windows-1251"?>, хотя, если использовать метод loadHTML() все парсится нормально.

Примеры кода:

Не работает.
Код

$xml = file_get_contents('http://www.thehack.ru/');
$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadXML($xml);
echo $dom->saveXML();


Работает.
Код

$xml = file_get_contents('http://www.thehack.ru/');
$dom = new DOMDocument('1.0', 'windows-1251');
$dom->loadHTML($xml);
echo $dom->saveHTML();


Цитата(sTa1kEr @ 28.10.2008,  15:14)

  [telepathy]Вы не перепутали случаем названия переменных с контентом? В моем пример это $xml, а в вашем $html[/telepathy]

В переменной $html хранится xhtml код.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)