Странные вещи при выводе XHTML с использованием SimpleXML

Я пытаюсь использовать SimpleXML для вывода правильно сформированного документа XHTML. Я делаю это так:

$pbDoc = new SimpleXMLElement('<?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 xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>'.$myTitle.'</title>
        <!-- Other headers -->
    </head>
</html>');

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

$dom = new DOMDocument();
$dom->loadXML($pbDoc->asXML());
$dom->formatOutput = true;
echo $dom->saveXML();

Теперь есть две странные вещи, которые меня беспокоят, и мне интересно, нормально ли это поведение и как его отключить, если это возможно.

  1. наличие DOCTYPE приводит к тому, что $pbDoc->asXML() добавляет ненужный метатег сразу после открывающего тега <head>:

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    

    Почему?

  2. по какой-то причине модуль DOM для меня вообще не делает отступ в коде (хотя он делает это очень хорошо с другим документом, который является XML, а не XHTML).

Может ли кто-нибудь просветить меня о том, где я могу ошибаться и как избавиться от этих неприятностей?


person Rimas Kudelis    schedule 07.07.2009    source источник
comment
Мне кажется, что SimpleXML переключается на какой-то «режим HTML».   -  person Boldewyn    schedule 07.07.2009
comment
Ага, мне тоже так кажется. Поэтому мне интересно, можно ли предотвратить этот режим.   -  person Rimas Kudelis    schedule 07.07.2009


Ответы (1)


1. Насколько я могу найти и предположить, SimpleXML автоматически порождает этот тег в HTML, потому что XML начинается с ‹html›

2. Вы можете попробовать это (http://pt2.php.net/manual/en/domdocument.loadxml.php#73933):

$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->loadXML($pbDoc->asXML());
$dom->formatOutput = true;
echo $dom->saveXML();

3. Что касается последнего (как от этого избавиться), я думаю, вы можете сделать простой str_replace() для выведенного XML. Таким образом, ваш код станет:

<?php

// Define the $pbDoc here

$dom = new DOMDocument();
$dom->loadXML($pbDoc->asXML());
$dom->formatOutput = true;
echo str_replace('<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />','',$dom->saveXML());

?>
person Pedro Cunha    schedule 08.07.2009
comment
Я думаю, что попробовал № 2, и это не помогло. Возможно, это помогло бы, если бы я удалил ‹meta› перед передачей строки в $dom-›loadXML, но я не уверен. В любом случае (по другой причине) теперь кажется, что SimpleXML для меня недостаточно, поэтому я собираюсь переписать свое приложение, чтобы вместо этого использовать DOM. Спасибо за ответ! :) - person Rimas Kudelis; 09.07.2009