изменить тип mime вывода в php

У меня есть php-скрипт. В большинстве случаев скрипт возвращает html, который работает нормально, но в одном случае (параметр ?Format=XML) скрипт возвращает XML вместо HTML.

Есть ли способ изменить возвращаемый тип mime вывода php на лету с text/html на text/xml или application/xml?


person Sam    schedule 30.09.2008    source источник
comment
Можете ли вы предоставить больше информации о том, что вы пытаетесь сделать? то есть RSS, xhtml и т. д.? Я также обнаружил эту ошибку: support.microsoft.com/kb/264868   -  person joelhardi    schedule 30.09.2008
comment
Убедитесь, что вы используете вызов заголовка до вывода любого текста   -  person Eran Galperin    schedule 30.09.2008
comment
Ого, моя ошибка, это работает в IE - в моем коде генерации XML была большая ошибка (я скопировал его из какого-то учебника и на самом деле не прочитал строку вывода, которая преобразовала XML в HTML с помощью htmlentities. Извините!!!   -  person Sam    schedule 30.09.2008
comment
PS.: Поскольку вам интересно, кажется, что на SO используется выбор первого правильного ответа... :-) Что логично.   -  person PhiLho    schedule 30.09.2008
comment
Да, кажется лучшим способом - хотя другие ответы содержат действительные точки, первый ответ отсутствует (отправьте перед любым другим выводом, используйте application/xml вместо text/xml). Спасибо!   -  person Sam    schedule 30.09.2008


Ответы (6)


header('Content-type: application/xml');

Дополнительная информация доступна в документации по PHP для header().

person nickf    schedule 30.09.2008
comment
Со мной случилось так, что клиент веб-службы, генерирующий Microsoft Visual Studio API, не любит application/xml, вместо этого ему требуется text/xml. - person GTodorov; 25.07.2017

Установите заголовок Content-Type:

header('Content-Type: text/xml');

Хотя вам, вероятно, следует использовать вместо этого «application/xml».

person John Millikin    schedule 30.09.2008
comment
Вы меня поняли - в чем разница между text/xml и application/xml? - person Sam; 30.09.2008
comment
Взаимодействия между типами содержимого text/* HTTP относительно кодирования, в основном: см. annevankesteren.nl/2005/03/ текст-xml - person John Millikin; 30.09.2008
comment
Кэширующим прокси разрешено редактировать text/* для изменения кодировки символов. Поскольку XML также объявляет свою кодировку символов внутри самого документа, вы действительно не хотите, чтобы это произошло, так как вы можете получить несоответствие. Поэтому используйте вместо этого application/xml, и кэширующие прокси-серверы увидят содержимое как двоичные данные и оставят его нетронутым. - person TRiG; 20.07.2010

Вы должны отправить заголовок Content-Type перед отправкой каких-либо выходных данных.

header('Content-Type: text/xml');
person andy.gurin    schedule 30.09.2008

Я отвечу на обновление, так как предыдущие ответы хороши.
Я читал, что Internet Explorer хорошо известен тем, что игнорирует заголовки типа Mime (большую часть времени?), чтобы полагаться на содержимое файла (что может вызвать проблемы). в некоторых случаях).

Ммм, я провел простой тест:

<?php
header('Content-Type: text/xml');
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root><foo a="b">Tada</foo></root>';
?>

Internet Explorer 6 правильно отображает его как XML. Даже если я удалю декларацию xml.
Вы должны указать, какая версия вызывает проблемы.

На самом деле, как я писал выше, с IE (по крайней мере 6) вам даже не нужен content-type, он распознает XML-данные и отображает их в виде дерева. Ваш XML правильный?

[Обновление] Пробовал и с IE7, добавив ?format=xml, по-прежнему корректно отображая XML. Если я отправлю искаженный XML, IE отобразит ошибку. Проверено на WinXP Pro SP2+

person PhiLho    schedule 30.09.2008
comment
Извините, моя ошибка, пример кода, который я скопировал, действительно отправлял XML через htmlentities для вывода, и я не заметил до сих пор! - person Sam; 30.09.2008
comment
Ах! В ПОРЯДКЕ. :-) Все мы учимся на ошибках (даже чужих!). - person PhiLho; 30.09.2008
comment
Я думаю, что у IE 6 есть проблема с text/xhtml; Я никогда не играл с ним, но я слышал много жалоб на него. Я считаю, что IE 6 просто не будет работать, если вы отправите текст/xhtml, но я не уверен. - person dirtside; 30.09.2008
comment
Один тип IE имеет проблемы с XHTML, то есть application/xhtml+xml или application/xml — IE не отображает XHTML, отправленный с любым из этих правильных типов контента (вы можете неправильно отправить как text/html, чтобы заставить IE использовать его режим HTML, но это неправильно и может вызвать другие побочные эффекты). - person joelhardi; 30.09.2008

header('Content-Type: application/xml; charset=utf-8');

Вы также можете добавить кодировку в той же строке. Я добавил utf-8, который встречается чаще всего.

person Usman Ahmed    schedule 11.02.2018

Я только что использовал следующее:
ПРИМЕЧАНИЕ. Я использую "i" для улучшенного расширения sql.

Start XML file, echo parent node
header("Content-type: text/xml");
echo "<?xml version='1.0' encoding='UTF-8'?>";
echo "<marker>";

Итерация по строкам, печать узлов XML для каждой

while ($row = @mysqli_fetch_assoc($results)){
  // Add to XML document node
  echo '<marker ';
  echo 'id="' . $ind . '" ';
  echo 'name="' . parseToXML($row['name']) . '" ';
  echo 'address="' . parseToXML($row['address']) . '" ';
  echo 'lat="' . $row['lat'] . '" ';
  echo 'lng="' . $row['lng'] . '" ';
  echo 'type="' . $row['type'] . '" ';
  echo '/>';
}

// End XML file
echo "</marker>";
person Thomas    schedule 12.07.2017