用php发送xml(声明xml)的问题

时间:2009-07-24 02:40:33

标签: php xml parsing rest simplexml

我的问题实际上是

如果我在一个类中有大部分逻辑,那么我将使用什么样的结构来发送xml作为REST服务的一部分。如果明确要求服务,我会在我的php索引页面的顶部调用/包含该类。

有人提到我,类方法不应该输出任何东西。 然后我应该在哪里输出xml。课外?

另外我有一个问题,即接收端说声明应该从文档的开头开始。

接收端在文档中只有这两行。 我还没有处理它的代码,但这已经给出了错误。

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

我可以看到你从这个类中发送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中的文档开头允许XML声明.php第4行PHP警告:simplexml_load_string()[function.simplexml-load-string]:在第4行的D:\ Domains \ tsa.nl \ wwwroot \ index.php中PHP警告:simplexml_load_string()[function.simplexml- load-string]:^在第4行的D:\ Domains \ tsa.nl \ wwwroot \ index.php

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

我们的问题很可能和我一样。正如所料,解决方案非常简单。我网站上的每个页面都需要一个文件,其中包含我为解析和管理网站而创建的一些类。在关闭php标记?>

之后,此文件有一个空格

由于该空间位于脚本之外,因此在调用require时,它默认包含在文档中。因此,请检查您包含/要求的所有文件的结尾。我的页面现在宣布<?xml没有问题。它是第一件事!

以下是我的验证:W3C VALIDATOR TO MY PAGE
你也可以在那里找到网站链接(这是我父亲的乐队网站..大声笑)

因此,检查任何可能位于<?PHP ?>之外的空格或换行符(使用include或require将在html文档上解析脚本之外的内容(在解析或执行其他任何内容之前)当你加入文件时就会出现这种情况,所以它在你做的所有事情之前,在这种情况下修剪超出了你的能力和范围。)

PS:如果您检查Validator,然后转到页面并检查源代码,您将看到<?xml声明,我的页面被100%解析(HTML中没有PHP)。

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

答案 2 :(得分:0)

嗯,快速回答是你在文档中的“&lt;?xml”之前有4个空行,这导致了错误。你需要查看你的代码并找出正在做的事情(虽然我不能老实地弄清楚这是怎么回事,因为如果你之前发送了任何输出,理论上标题会抛出错误)。您发布的代码肯定不会在xml声明之前输出额外的4行,因此问题在您的代码中的其他位置:)

[更新]希望我能发表评论,但是对于提供的其他答案,输出缓冲和修剪肯定会解决问题,但更好的解决方案是弄清楚那些额外的4行空白来自何处(没有任何侮辱,但修剪输出缓冲区是一个创可贴的解决方案)