2009-07-24 6 views
0

ma question est en faitprob! Em avec l'envoi xml (déclaration xml) avec php

Quelle est la structure type de ce que j'utiliser pour envoyer xml dans le cadre de un service REST si j'ai le plus large de la logique dans une classe. J'appelle/inclue la classe en haut de ma page d'index php s'il devient clair qu'un service est demandé.

Quelqu'un m'a mentionné qu'une méthode de classe ne devrait rien produire. Alors où dois-je sortir le fichier XML. En dehors de la classe?

Également j'ai un problème que l'extrémité de réception dise que la déclaration devrait commencer au début du document.

L'extrémité réceptrice n'a que ces deux lignes dans le document. Je n'ai pas encore de code pour le traiter, mais cela donne déjà une erreur.

<?php 
$url='http://www.woonbel.nl/gps/setgpsloc'; 
$xml =simplexml_load_string(file_get_contents($url)); 
?> 

J'envoyer le fichier XML de cette classe comme vous pouvez le voir, alors peut-être ici mal, de quelque chose aller quelque chose avec des lignes blanches ou autre chose. De toute façon, j'ai besoin de quelques conseils pour éviter l'erreur de déclaration et comment envoyer xml si je ne suis pas censé le faire dans une méthode? Stockez-le dans une variable de classe d'abord alors peut-être?

<?php 
class gps { 

    public $url; 
    public $test;  

    function __construct($url) { 
    $this->url = $url; 
    } 

    function invoke($methode_naam) { 
    switch($methode_naam){ 

    case "test": 
    $this->setgpsloc(); 

    break; 
    case "setgpsloc": 
    header('Content-type: text/xml');  


$status_code = 2; 
     $output= "<?xml version=\"1.0\"encoding=\"utf-8\"?>\n"; 
     $output.= "<response>\n"; 
     $output.= "\t<status>$status_code</status>\n"; 
     $output.= "\t<fout>Geen</fout>\n"; 
     $output.= "</response>"; 
     echo trim($output);  


    } 


    }//EINDE invoke 



} 

?> 

Voilà comment je perçois si un service est demandé et appeler la classe

<?php 
//WEBSERVICE SECTIE 
$url = $_GET['url']; 
$parts = split('/', $url); // Opslaan van delen van de aangevraagde url in $parts 
$cparts=count($parts); 
//if($cparts>=2){ 
$controller = $parts[0]; 
$wslijst=array("gps","gebruikers"); 
if(in_array($controller,$wslijst)){ 
    include $controller .".php"; 
    $clr = new $controller("test"); 
    $clr->invoke($parts[1]); 
    exit(); 
    } 
//other code underneath for displaying normal page 

?> 

Ceci est l'erreur réelle du

PHP get extrémité de réception de Warning: simplexml_load_string() [fonction. simplexml-load-string]: Entité: ligne 4: erreur de l'analyseur: déclaration XML autorisée uniquement au début du document dans D: \ Domains \ tsa.nl \ wwwroot \ index.php sur la ligne 4 PHP Warning: simplexml_load_string() [ function.simplexml-load-string]: dans D: \ Domains \ tsa.nl \ wwwroot \ index.php sur la ligne 4 PHP Wa rning: simplexml_load_string() [function.simplexml-load-chaîne]:^dans D: \ Domains \ tsa.nl \ wwwroot \ index.php sur la ligne 4

Répondre

0

Eh bien, la réponse rapide est que vous avez 4 lignes vides avant votre "<? xml" dans le document, ce qui provoque l'erreur. Vous aurez besoin de passer en revue votre code et de découvrir ce qu'il fait (bien que je ne puisse pas vraiment comprendre comment cela se passe, car l'en-tête devrait théoriquement renvoyer une erreur si vous avez envoyé une sortie avant). Le code que vous avez posté ne produit pas les 4 lignes supplémentaires avant la déclaration xml, donc le problème est ailleurs dans votre code :)

[MISE À JOUR] J'aimerais pouvoir commenter, mais en ce qui concerne l'autre réponse fournie, la mise en mémoire tampon et le découpage de sortie résoudront certainement le problème, mais la meilleure solution consisterait à déterminer d'où proviennent ces 4 lignes d'espaces supplémentaires (aucune insulte n'est prévue, mais l'ajustement du tampon de sortie est un peu un palliatif)

+0

Je suis d'accord avec vous, le découpage est une solution de pansement, la meilleure solution consiste à trouver d'où proviennent ces espaces. C'était juste un "quick-fix" hehe – Nathan

+0

J'ai édité ma question, le découpage n'a pas fonctionné non plus. Donc le reste de la classe a l'air ok? Je vais ajouter l'appel du code de la classe – Richard

+0

@Nathan, rien de mal avec des solutions rapides;) –

1

Comme dans "http://www.woonbel.nl/gps/setgpsloc", vous avez des espaces vides avant la déclaration XML. Je vous recommande de découper (http://php.net/trim) votre sortie.

//Edit, you forgot a space between \" and encoding bellow 
    $output = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; 
        //-----------------^ 
    $output .= "<response>\n"; 
    $output .= "\t<status>$status_code</status>\n"; 
    $output .= "\t<fout>Geen</fout>\n"; 
    $output .= "</response>"; 
    echo trim($output); 

S'il y a quelque chose d'autre dans votre code qui peut-être envoient ces sorties, vous pouvez l'obtenir sur un tampon:

//In the beginning of your script 
    ob_start(); 

    //In the end of your script 
    $output = ob_get_clean(); 
    echo trim($output); 
+0

Mais à quels espaces blancs est-il reffering. Je vais essayer votre chemin, peut-être que cela fonctionnera magiquement. Vous avez seulement manqué les dottes pour connecter les chaînes partielles. – Richard

+0

Rien dans le code que vous avez posté ici n'imprime ces espaces, mais je crois qu'en utilisant le tampon, vous pouvez le faire fonctionner. Je vais éditer les points, hehe. – Nathan

+0

merci, j'espère que cela fonctionne, mais il est stupide que je ne peux pas comprendre d'où il vient. – Richard

2

Il y a une bonne chance que notre problème est le même que j'étais ayant.La solution était vraiment simple, comme prévu. Chaque page de mon site nécessite un fichier avec quelques classes que j'ai faites pour analyser et gérer le site. Ce fichier contenait un espace '' juste après la balise php de fermeture

Cet espace étant en dehors du script, il était inclus dans le document par défaut lors de l'appel de require. Donc, vérifiez la fin de tous les fichiers que vous incluez/exigeant. Mes pages déclarent le <?xml sans problèmes maintenant. IL DOIT ÊTRE LA PREMIÈRE CHOSE!

Voici ma validation: W3C VALIDATOR TO MY PAGE
Vous pouvez trouver le lien du site là aussi (il est le site de la bande de mon père .. lol)

Donc, vérifiez tout espace ou nouvelle ligne EN DEHORS DU <?PHP ?> qui est probablement où il vient de (using include ou require analysera cela en dehors du script, sur le document html (et avant d'analyser ou d'exécuter quoi que ce soit d'autre, qui est arrivé quand vous avez inclus le fichier, donc c'est "avant" tout ce que vous faites, PS: Si vous cochez le Validateur, puis allez à la page et cliquez sur OK. vérifier le code source, vous verrez la déclaration <?xml, Mes pages sont analysées à 100% (pas de PHP dans le code HTML).

Espérons que cela aide ... Cheers! :)

+0

J'ai passé des heures à chercher une solution et c'était exactement ce problème: un espace après la balise '?>' Dans un fichier 'require_once'. Je vous remercie! – Mike