Я вижу из комментариев, что вы работаете в рамках CMS и не можете остановить вывод контента до того места, где будет ваш код.
Если скрипт, в котором вы работаете, уже выводит контент (вне вашего контроля), то вы не сможете сделать то, чего пытаетесь достичь, всего за один скрипт.
Ваш сценарий может либо отправлять заголовки с надписью «следующее содержимое - HTML», затем выводить HTML, либо отправлять заголовки с надписью «следующее содержимое - это XML, является вложением и имеет определенное имя файла». Вы не можете сделать оба.
Вы можете либо вывести HTML, содержащий ссылку на отдельный скрипт для загрузки файла XML, либо вы можете загрузить файл и не выводить HTML.
Таким образом, вам нужно будет добавить ссылку на скачивание в вывод изменяемого сценария CMS, а затем обработать загрузку в отдельном сценарии.
Я сделал рабочий пример, который должен помочь. Пример включает в себя простой HTML-документ, содержащий ссылку для загрузки, и PHP-скрипт, который затем обрабатывает загрузку.
Посмотрите код ниже или посмотрите живой пример .
HTML (посторонний пух удален, не обязательно действителен)
<html>
<head>
<title>XML Download Example</title>
</head>
<body>
<a href="download.php">Download XML example</a>
</body>
</html>
PHP
<?php
// Populate XML document
$doc = new DomDocument();
// ... various modifications to the document are made
// Output headers
header('Content-type: "text/xml"; charset="utf8"');
header('Content-disposition: attachment; filename="example.xml"');
// Output content
echo $doc->saveXML();
?>
Если вы не можете полностью обработать загрузку с помощью второго сценария (возможно, вы не можете получить доступ к соответствующим данным), вам придется переосмыслить проблему.