2008-09-30 14 views
42

J'ai un script PHP. La plupart du temps, le script retourne html, ce qui fonctionne bien, mais une fois (paramètre? Format = XML) le script retourne XML au lieu de HTML.changer mime type de sortie en php

Y at-il un moyen de changer le type mime retourné de la sortie php à la volée de text/html en text/xml ou application/xml?

+0

Pouvez-vous fournir plus d'informations sur ce que vous essayez de faire? c'est-à-dire RSS, xhtml etc.? J'ai également trouvé ce bug: http://support.microsoft.com/kb/264868/ – joelhardi

+0

Assurez-vous que vous utilisez l'appel en-tête avant que tout texte est sorti –

+0

Whoah, mon erreur, cela fonctionne dans IE - mon code de génération XML avait une grande grosse erreur (je l'ai copiée à partir d'un tutoriel, et je n'ai pas vraiment lu la ligne de sortie, qui a converti le code HTML en HTML en utilisant htmlentities Désolé ... – Sam

Répondre

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

Plus d'informations disponibles à la documentation PHP pour header()

+0

Il m'est arrivé que l'API Microsoft Visual Studio générant le service Web client n'aime pas le "application/xml", il nécessite "text/xml" à la place. – GTodorov

13

l'en-tête défini Content-Type:

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

Bien que vous devriez probablement utiliser "application/xml" à la place.

+1

Vous m'avez compris, quelle est la différence entre text/xml et application/xml? – Sam

+0

Interactions entre les types de contenu text/* HTTP concernant le codage, principalement: voir http://annevankesteren.nl/2005/03/text-xml –

+5

Les proxys de mise en mémoire cache sont autorisés à modifier 'text/*' pour changer le codage des caractères. Puisque XML déclare également son codage de caractères dans le document lui-même, vous ne voulez vraiment pas que cela se produise, car vous pourriez avoir une incompatibilité. Donc, utilisez 'application/xml' à la place, et les proxys de mise en cache verront le contenu comme des données binaires et le laisseront intact. – TRiG

3

Vous devez envoyer un Content-Type en-tête avant pour envoyer une sortie.

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

Je vais répondre à la mise à jour, car les réponses précédentes sont bonnes.
J'ai lu qu'Internet Explorer est bien connu pour ignorer les en-têtes de type Mime (la plupart du temps?) Pour s'appuyer sur le contenu du fichier (ce qui peut causer des problèmes dans certains cas).

Mmm, je l'ai fait un test simple:

<?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 affiche correctement au format XML. Même si je supprime la déclaration XML.
Vous devez indiquer quelle version est problématique.

En fait, comme je l'ai écrit ci-dessus, avec IE (6 au moins), vous n'avez même pas besoin d'un type de contenu, il reconnaît les données XML et les affiche comme un arbre. Est-ce que votre XML est correct? [Mise à jour] Essayé également avec IE7, en ajoutant? Format = xml, toujours en affichant correctement XML. Si j'envoie du XML malformé, IE affiche une erreur. Testé sur WinXP Pro SP2 +

+0

Désolé, mon erreur, l'exemple de code que j'ai copié a envoyé le code XML via htmlentities pour la sortie, et je n'ai pas remarqué jusqu'à présent! – Sam

+0

Ah! D'ACCORD. :-) Nous apprenons tous des erreurs (même celles des autres!). – PhiLho

+0

Je pense que c'est le texte/xhtml que IE 6 a un problème avec; Je n'ai jamais joué avec, mais j'ai entendu beaucoup de plaintes à ce sujet. Je crois que IE 6 ne fonctionnera tout simplement pas si vous envoyez du texte/xhtml, mais je ne suis pas sûr. – dirtside

0

Je viens d'utiliser ce qui suit:
NOTE: J'utilise "i" pour l'extension améliorée sql.

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

Itérer à travers les lignes, les noeuds XML d'impression pour chaque

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>"; 
0
header('Content-Type: application/xml; charset=utf-8'); 

Vous pouvez ajouter un codage aussi bien dans la même ligne. J'ai ajouté utf-8, qui est le plus commun.