2009-07-24 141 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)。

希望这会有所帮助... 干杯! :)