Por partes... primero, cuando tengas errores sería idóneo indicaras
exáctamente cuáles son y el código causante de error (comentado para encontrar las partes en conflicto, claro

).
Entiendo lo que experimentáste es que poniendo la función header() antes de <?xml fue lo que resultó en error, por el contrario poniendolo después corrió bien:
Código PHP:
<?php
/* ------- ERROR --------*/
header( "Content-type: text/xml");
echo '<'; ?>?xml version="1.0" encoding="ISO-8859-1"?>
<?php
/* ------- SIN ERROR -----------*/
echo '<'; ?>?xml version="1.0" encoding="ISO-8859-1"?>
<?php // Nota: header() ES una función PHP
header( "Content-type: text/xml");
?>
... no tiene sentido. Las cabeceras HTTP deben ser enviadas antes de cualquier "contenido" del archivo; header() tiene que estar
antes de cualquier salida al navegador, incluyendo espacios en blanco. Tu primer código esta bien (siempre y cuando no haya ningúna línea antes de lo que muestras) lo que propónes de utilizar
header() después del
echo es lo que es erróneo.
www.php.net/header
Lo de que te funcione sin header()... ¿en dónde?, ¿haciendo qué?.
Hay varios factores a considerar:
- El script que envia esta información mediante funciones propias del lenguaje.
- El servidor tiene una configuración para indicar un tipo por default a los archivos que entrega.
- El contenido del propio archivo; XML, siendo un lenguaje independiente, lo indica con la línea
<?xml version="xxx" encoding="xxx" ?>, coherentemente tiene que ser la primera línea y es parte de una especificación.
- El cliente, quien recibe e interpreta la información; pudiendo ser un navegador o una aplicación... o lo que sea.
Recomendable utilizar header(), podría ahora servirte a tí (sigo preguntando dónde y cómo es eso) pero eso no garantiza sirva a los demás (supóngo será servido a varias persónas).
Saluton