Cakephp генерирует ошибку XML - пробел

Я пытаюсь создать динамический XML-документ в CakePHP для вывода в браузер.

Вот мой код контроллера:

Configure::write ('debug', 0);
$this->layout = null;
header('Content-type: text/xml');
echo "<?xml version=\"1.0\"?>";

Вид выглядит примерно так:

<abc>
     something
</abc>

Результат, вероятно, как и ожидалось:

<?xml version="1.0"?><abc>something</abc>

Единственная проблема в том, что есть место перед <?xml давая мне ошибку:

XML Parsing Error: XML or text declaration not at start of entity
Line Number 1, Column 2:
 <?xml version="1.0"?><abc> something </abc>
-^

Я знаю эту проблему в PHP, когда у вас есть php-start и end-теги, он оставляет пробел и создает проблемы, поэтому я попытался переместить строку echo "<?xml ver... контролеру с точки зрения, чтобы избежать этого, но это не помогло.

Заранее спасибо. -happyhardik

3 ответа

Решение

Да, проблема должна быть в пробеле где-то после конечного тега php.

Поскольку конечный тег php не является обязательным, удалите любой конечный тег во всех ваших моделях (если таковые имеются), контроллер, о котором вы спрашиваете, из app_controller.php и app_model.php и из помощников вида... должно быть где-то, но это не легко найти

РЕДАКТИРОВАТЬ: Фактически это может быть также пробел перед тегом php begin, посмотрите эти файлы и убедитесь, что тег begin находится в абсолютном начале файла.

ВНОВЬ РЕДАКТИРОВАТЬ: Есть люди, которые создали несколько сценариев для того, чтобы делать это автоматически для вас, взгляните на:

http://ragrawal.wordpress.com/2007/11/07/script-for-removing-blank-spaces-before-and-after-php-tags/

Хотя это не дает прямого ответа на вопрос. Я подумал, что стоит упомянуть, как легко создавать динамические представления XML автоматически с использованием помощника CakePHP JSON и представлений XML, на тот случай, если люди не захотят делать это вручную, как, кажется, выше.

  • Шаг первый: Добавить Router::parseExtensions(); в ваш файл rout.php
  • Шаг второй: Убедитесь, что компонент RequestHandler включен в соответствующий счетчик, добавив public $components = array('RequestHandler');
  • Шаг третий: Теперь нам нужно только загрузить некоторые данные и затем автоматически отобразить данные в формате XML или JSON. Добавьте что-то вроде ниже:

    public function xml_view () {
       $this->set('data_array', $this->Model->find('all'));
       $this->set('_serialize', array('data_array'));       
    }
    

Это буквально все, что нам нужно сделать, чтобы сгенерировать ответ XML или JSON для действия xml_view. Даже не нужно настраивать файл просмотра. Если ваш запрос.../controller/xml_view.xml, то CakePHP вернет XML-документ, а когда.json является расширением, будет сгенерирован ответ JSON. Так легко, я не могу в это поверить!

На самом деле, я обнаружил, что чаще всего это пробел после закрывающего тега?> В файле макета.

Кроме того, вы должны знать, что если вы используете компонент RequestHandler и Router::parseExtensions( 'xml') в вашем rout.php, вы автоматически получите XmlHelper для использования в ваших представлениях xml.

В XmlHelper есть несколько полезных функций. Проверьте это.

<?php
    echo( $xml->header( ));
    // outputs <?xml version="1.0" encoding="UTF-8" ?>
?>

Ссылки на Компонент RequestHandler и XmlHelper

http://book.cakephp.org/view/174/Request-Handling

http://book.cakephp.org/view/380/XML

Другие вопросы по тегам