2009-07-24 32 views
0

我的問題發送XML(聲明XML)實際上是概率!EM與PHP

我會用什麼樣的懸掛結構發送XML作爲部分掀起了REST服務,如果我有一類最關的邏輯。我打電話給/包括我的php索引頁頂部的類,如果它變得清晰的服務被請求。

有人向我提到一個類方法不應該輸出任何東西。 然後,我應該在哪裏輸出xml。課外?

此外,我有一個問題,接收端說聲明應該從開始文檔開始。

接收端文件中只有這兩行。 我沒有代碼來處理它,但是這已經給出了一個錯誤。

<?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()函數。 simplexml-load-string]:Entity:line 4:parser error:XML聲明只允許在第4行D:\ Domains \ tsa.nl \ wwwroot \ index.php中的文檔開始處PHP警告:simplexml_load_string()[ function.simplexml-load-string]:在第4行D:\ Domains \ tsa.nl \ wwwroot \ index.php PHP Wa rning:simplexml_load_string()[function.simplexml-load-string]:^在D行:\ Domains \ tsa.nl \ wwwroot \ index.php on line 4

回答

0

好吧,快速的回答是,你有4個空行之前您的「<?xml」在文檔中,這是導致錯誤。你需要仔細檢查你的代碼並找出正在做的事情(雖然我不能真正弄清楚發生了什麼,因爲如果你在它之前發送了任何輸出,標題理論上會拋出一個錯誤)。您發佈的代碼絕對不會在xml聲明之前輸出額外的4行,所以問題的其他地方在您的代碼:)

[更新]希望我能發表評論,但對於提供的其他答案,輸出緩衝和修整必然會解決這個問題,但更好的解決方案是找出那些額外的4行空白來自哪裏(不需要破壞,但修剪輸出緩衝區是一種帶幫助解決方案)

+0

我同意你,修剪它是一個創可貼的解決方案,找出這個空間來自哪裏是最好的解決方案。這只是一個「快速修復」呵呵 – Nathan 2009-07-24 03:08:16

+0

我編輯了我的問題,修剪也沒有工作。所以班上的其他人看起來好嗎?我會把課程代碼加入課程代碼 – Richard 2009-07-24 03:09:06

+0

@Nathan,快速修復沒什麼問題;) – 2009-07-25 04:16:51

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

有一個很好的機會,我們的問題是我是一樣的有。正如預期的那樣,解決方案非常簡單。我網站上的每個頁面都需要一個文件,其中包含一些我用來分析和管理網站的類。該文件在關閉php標籤後有一個空格?>

由於該空間位於腳本之外,因此在調用require時默認包含在文檔中。因此,請檢查包含/要求的所有文件的結尾。我的網頁現在宣佈<?xml沒有問題。這是第一件事!

這裏是我的驗證:W3C VALIDATOR TO MY PAGE
您可以找到該網站的鏈接有作爲(這是我父親的樂隊網站..笑)

所以,檢查外<?PHP ?>任何空格或換行這可能是哪裏它來自於(使用include或require會在腳本之外,在html文檔中解析該文件(並且在解析或執行任何其他內容之前,當您包含該文件時出現這種情況,所以它在'所有'之前'在這種情況下,裁剪不在你的能力範圍內)

PS:如果你選中Validator,然後進入頁面檢查源代碼,你會看到<?xml聲明,我的頁面被100%解析(HTML內沒有PHP)。

希望這會有所幫助... 乾杯! :)