0

私の質問は実際には

クラスのロジックがほとんどオフになっている場合、REST サービスの一部として xml を送信するためにどのようなオフ構造を使用するでしょうか。サービスが要求されていることが明らかになった場合は、php インデックス ページの上部にあるクラスを呼び出す/含めます。

クラスメソッドは何も出力すべきではないと誰かが私に言いました。次に、xmlをどこに出力する必要がありますか。クラス外?

また、受信側が、ドキュメントの最初から宣言を開始する必要があると言っているという問題があります。

受信側には、ドキュメントにこれらの 2 行しかありません。まだ処理するコードはありませんが、これはすでにエラーになります。

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

ご覧のとおり、このクラスから xml を送信します。おそらく、ここで何か問題が発生している可能性があります。とにかく、宣言エラーを回避する方法と、xml をメソッドで実行することになっていない場合に xml を送信する方法についてアドバイスが必要です。最初にクラス変数に保存してから、多分?

<?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 



}   

?> 

これは、サービスが要求されているかどうかを検出してクラスを呼び出す方法です

<?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

?>

これは、受信側が取得する実際のエラーです

PHP 警告: simplexml_load_string() [function.simplexml-load-string]: エンティティ: 4 行目: パーサー エラー: D:\Domains\tsa.nl\wwwroot\index.php のドキュメントの先頭でのみ XML 宣言が許可されています4 行目 PHP 警告: simplexml_load_string() [function.simplexml-load-string]: in D:\Domains\tsa.nl\wwwroot\index.php 4 行目 PHP 警告: simplexml_load_string() [function.simplexml-load-string ]: 4 行目の D:\Domains\tsa.nl\wwwroot\index.php 内の ^

4

3 に答える 3

1

http://www.woonbel.nl/gps/setgpsloc」のように、XML 宣言の前に空白があります。出力をトリム ( http://php.net/trim ) することをお勧めします。

    //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);

コードにこれらの出力を送信している可能性のある何かがある場合は、バッファで取得できます。

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

    //In the end of your script
    $output = ob_get_clean();
    echo trim($output);
于 2009-07-24T02:47:09.190 に答える
1

私たちの問題が私が抱えていたものと同じである可能性は十分にあります。予想通り、解決策は本当に簡単でした。私のサイトのすべてのページは、サイトを解析して管理するために作成したいくつかのクラスを含むファイルをrequire__onceします。このファイルには、終了 php タグの直後にスペース「 」がありました?>

そのスペースはスクリプトの外側にあるため、 require が呼び出されたときにデフォルトでドキュメントに含まれていました。そのため、含める/必要とするすべてのファイルの末尾を確認してください。<?xml私のページは現在問題なしと宣言しています。それは最初のものでなければなりません!

ここに私の検証があります: W3C VALIDATOR TO MY PAGE
サイトリンクもそこにあります (私の父のバンドサイトです.. 笑)

したがって、おそらくそれがどこから来ているのか、外側のスペースまたは改行を確認してください<?PHP ?>(includeまたはrequireを使用すると、スクリプトの外側のhtmlドキュメントで解析されます(そして、他のものを解析または実行する前に、ファイル、したがって、それはあなたがしているすべての「前」であり、この場合、トリミングはあなたの力と範囲外です)。

PS: Validator を確認してから、ページに移動してソース コードを確認すると<?xml、My pages are 100% parsed (No PHP inside HTML) という宣言が表示されます。

これが役に立てば幸いです...乾杯!:)

于 2009-11-10T16:51:58.487 に答える
0

簡単な答えは、ドキュメント内の "<?xml" の前に 4 つの空白行があることです。これがエラーの原因です。コードを調べて、それが何をしているのかを調べる必要があります(ただし、ヘッダーの前に出力を送信すると、理論的にはヘッダーがエラーをスローするため、それがどのように発生するかは正直わかりません)。あなたが投稿したコードは間違いなくxml宣言の前に余分な4行を出力しないので、問題はあなたのコードの他の場所にあります:)

[更新] コメントできればいいのですが、提供された他の回答に関しては、出力のバッファリングとトリミングによって問題は確実に解決されますが、より良い解決策は、余分な 4 行の空白がどこから来ているのかを突き止めることです (侮辱を意図したものではありません)。 、しかし出力バッファのトリミングは応急処置のようなものです)

于 2009-07-24T02:46:07.490 に答える