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