проблема! с отправкой xml (декларация xml) с php

мой вопрос на самом деле

Какую структуру я бы использовал для отправки 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: ошибка синтаксического анализатора: объявление XML разрешено только в начале документа в D:\Domains\tsa.nl\wwwroot\index.php на строка 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 ]: ^ в D:\Domains\tsa.nl\wwwroot\index.php в строке 4


person Richard    schedule 24.07.2009    source источник


Ответы (3)


Как и в "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);
person Nathan    schedule 24.07.2009
comment
Но о каких пробелах идет речь. Попробую ваш способ, может волшебным образом сработает. Вы только пропустили точки, чтобы соединить частичные строки. - person Richard; 24.07.2009
comment
Ничто в коде, который вы разместили здесь, не печатает эти пробелы, но я считаю, что с помощью буфера вы можете заставить его работать. Я отредактирую точки, хе-хе. - person Nathan; 24.07.2009
comment
спасибо, я надеюсь, что это сработает, но это глупо, что я не могу понять, откуда это. - person Richard; 24.07.2009
comment
разве нет какого-нибудь инструмента для его обнаружения? - person Richard; 24.07.2009
comment
Я не знаю какого-либо конкретного инструмента для этой ситуации, но вы можете попробовать отлаживать части своего кода, пока не найдете здесь, откуда он взялся. - person Nathan; 24.07.2009
comment
Я попытался просто отправить xml перед объявлением любого класса. Включение будет просто повторять вывод. Я вижу это: Entity: строка 1: ошибка синтаксического анализатора: здесь требуется пробел в D:\Domains\tsa.nl\wwwroot\index.php в строке 4////// Это немного отличается. Может быть, file_get_contents делает что-то не так? - person Richard; 24.07.2009
comment
Ричард, фактическая ошибка связана с отсутствием пробела между версией и кодировкой: ‹?xml version=\1.0\(Здесь нужно добавить пробел)encoding=\utf-8\?›\n. - person Nathan; 24.07.2009
comment
о, хорошо, я не могу проверить это сейчас. Я сделаю это через некоторое время. Ты будешь здесь от меня - person Richard; 24.07.2009

Есть большая вероятность, что у нас та же проблема, что и у меня. Решение было действительно простым, как и ожидалось. Каждая страница на моем сайте требует__один раз файл с некоторыми классами, которые я создал для анализа и управления сайтом. В этом файле был пробел ' ' сразу после закрывающего тега php ?>

Поскольку это пространство находится за пределами скрипта, оно было включено в документ по умолчанию при вызове require. Итак, проверьте конец всех файлов, которые вы включаете/требуете. Мои страницы объявляют <?xml без проблем. ЭТО ДОЛЖНО БЫТЬ ПЕРВЫМ!

Вот моя проверка: ПРОВЕРКА W3C НА МОЮ СТРАНИЦУ
Там же можно найти ссылку на сайт (это сайт группы моего отца.. лол)

Итак, проверьте любой пробел или новую строку ВНЕ <?PHP ?>, откуда они, вероятно, исходят (используя include или require будет анализировать это вне сценария, в html-документе (и до того, как вы проанализируете или выполните что-либо еще, что появилось, когда вы включили файл, так что это «до» всего, что вы делаете, обрезка в этом случае не в ваших силах и возможностях).

PS: Если вы проверите Валидатор, а затем перейдете на страницу и проверите исходный код, вы увидите объявление <?xml Мои страницы проанализированы на 100% (без PHP внутри HTML).

Надеюсь, это поможет... Ура! :)

person Community    schedule 10.11.2009
comment
Потратил часы на поиск решения этой проблемы, и проблема была именно в этом: пробел после тега ?> в файле require_once. Спасибо! - person ; 24.05.2014

Что ж, быстрый ответ: у вас есть 4 пустые строки перед вашим «‹?xml» в документе, что и вызывает ошибку. Вам нужно будет просмотреть свой код и выяснить, что это делает (хотя я, честно говоря, не могу понять, как это происходит, потому что заголовок теоретически выдаст ошибку, если вы отправите какой-либо вывод до него). Код, который вы разместили, определенно не выводит дополнительные 4 строки перед объявлением xml, поэтому проблема в другом месте вашего кода :)

[ОБНОВЛЕНИЕ] Хотел бы я прокомментировать, но что касается другого предоставленного ответа, буферизация и обрезка вывода, безусловно, решат проблему, но лучшим решением было бы выяснить, откуда берутся эти дополнительные 4 строки пробела (без оскорблений) , но обрезка выходного буфера — это временное решение)

person Ian Selby    schedule 24.07.2009
comment
Я согласен с вами, обрезка — это временное решение, а выяснить, откуда берутся эти пробелы, — лучшее решение. Это было просто быстрое решение, хе-хе - person Nathan; 24.07.2009
comment
Я отредактировал свой вопрос, обрезка тоже не сработала. Значит, остальные вне класса выглядят нормально? Я добавлю вызов кода класса - person Richard; 24.07.2009