PHP -> XML Erstellung mit DomDocument erzeugt Leerzeichen am Anfang

  • PHP -> XML Erstellung mit DomDocument erzeugt Leerzeichen am Anfang

    Hi,

    ich habe folgendes geschrieben um aus meiner mySQL DB eine XML zu erzeugen und zu verschicken

    PHP-Quellcode

    1. <?php
    2. include 'mat_auth.php';
    3. if(!isset($_POST['lastSync']))
    4. die('ERROR: lastSync not found');
    5. $lastsync=$_POST['lastSync'];
    6. $result=mysql_query("SELECT * FROM mat_waypoint WHERE lastModified > '".$lastsync."'");
    7. if(!$result)
    8. die('ERROR: cannot select waypoints');
    9. $doc=new DomDocument('1.0');
    10. $root=$doc->createElement('root');
    11. $root=$doc->appendChild($root);
    12. while($row=mysql_fetch_assoc($result))
    13. {
    14. $occ=$doc->createElement('waypoint');
    15. $occ=$root->appendChild($occ);
    16. foreach ($row as $fieldname => $fieldvalue)
    17. {
    18. $child=$doc->createElement($fieldname);
    19. $child=$occ->appendChild($child);
    20. $value=$doc->createTextNode($fieldvalue);
    21. $child=$child->appendChild($value);
    22. }
    23. }
    24. echo $doc->saveXML();
    25. ?>
    Alles anzeigen


    Klappt soweit auch wunderbar, nur wenn ich das auf meiner Mac App empfange und versuche mittels NSXMLParser zu parsen, bricht der sofort mit dem Fehler 64 ab, weil vor dem <?xml genau ein Leerzeichen steht.

    Wiso ist das so ? Kann ich das im PHP ändern oder im XMLParser oder muss ich tatsächlich aus den downloadData einen String machen, das Leerzeichen am Anfang entfernen und wieder ein NSData davon erzeugen ?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)

  • Ich würde den Fehler allerdings nicht clientseitig beheben. Der Server hat schließlich dafür zu sorgen, dass er vernünftiges XML ausspuckt und der Standard erlaubt keine Zeichen vor der XML-Deklaration:

    Quellcode

    1. echo trim($doc->saveXML());
    sollte jedoch das Problem lösen.
    „Meine Komplikation hatte eine Komplikation.“
  • Also bei mir liefert

    PHP-Quellcode

    1. <?php
    2. $doc=new DomDocument('1.0');
    3. $root=$doc->createElement('root');
    4. $root=$doc->appendChild($root);
    5. echo $doc->saveXML();
    6. ?>

    als Ergebnis

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <root/>

    Ganz ohne Leerzeichen und so. Was für eine PHP-Version ist das denn?
    „Meine Komplikation hatte eine Komplikation.“
  • Thallius schrieb:

    Klappt soweit auch wunderbar, nur wenn ich das auf meiner Mac App empfange und versuche mittels NSXMLParser zu parsen, bricht der sofort mit dem Fehler 64 ab, weil vor dem <?xml genau ein Leerzeichen steht.
    Anhand des Codes, den Du geposted hast, kann man nicht exakt beurteilen, worin das Problem liegt, aber ich garantiere Dir, dass es nicht ein Bug in PHP ist, sondern ein Problem mit Deinem Code, sprich: irgendwo kommt der Whitespace her. Erfahrungsgemäß würde ich als erstes mal in der includeten Datei »mat_auth.php« suchen und insbesondere danach schauen, ob evtl. am Dateiende ein schließendes ?> steht, nach dem Whitespace folgt. (Am Dateiende kannst Du Dir ?> grundsätzlich sparen und genau aus dem beschriebenen Grund verbieten das Coding Guidelines für einige wichtige PHP-Frameworks auch.

    Thallius schrieb:

    $lastsync=$_POST['lastSync'];

    $result=mysql_query("SELECT * FROM mat_waypoint WHERE lastModified > '".$lastsync."'");
    Bitte lesen: de.wikipedia.org/wiki/SQL-Injection

    Carsten

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von BlueM ()

  • BlueM schrieb:

    Thallius schrieb:

    Klappt soweit auch wunderbar, nur wenn ich das auf meiner Mac App empfange und versuche mittels NSXMLParser zu parsen, bricht der sofort mit dem Fehler 64 ab, weil vor dem <?xml genau ein Leerzeichen steht.
    Anhand des Codes, den Du geposted hast, kann man nicht exakt beurteilen, worin das Problem liegt, aber ich garantiere Dir, dass es nicht ein Bug in PHP ist, sondern ein Problem mit Deinem Code, sprich: irgendwo kommt der Whitespace her. Erfahrungsgemäß würde ich als erstes mal in der includeten Datei »mat_auth.php« suchen und insbesondere danach schauen, ob evtl. am Dateiende ein schließendes ?> steht, nach dem Whitespace folgt. (Am Dateiende kannst Du Dir ?> grundsätzlich sparen und genau aus dem beschriebenen Grund verbieten das Coding Guidelines für einige wichtige PHP-Frameworks auch.

    Thallius schrieb:

    $lastsync=$_POST['lastSync'];

    $result=mysql_query("SELECT * FROM mat_waypoint WHERE lastModified > '".$lastsync."'");
    Bitte lesen: de.wikipedia.org/wiki/SQL-Injection

    Carsten


    Hi Carsten,

    vielen Dank, genau das war es. Aber nicht im mat_auth sondern im gleichen File war wohl irgendwann aus versehen vor dem <?php in der ersten Zeile ein Leerzeichen rein gekommen. Nun geht es auch ohne Fusch. Danke.

    Das mit dem Injektion ist mir klar und ich werde das noch richten wenn ich es sauber mache. Im Moment ist das alles noch ein bisschen Herumprobiererei wie ich es später richtig konzeptioniere.

    Trotzdem besten Dank

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • denniz schrieb:

    Das mit dem Injektion ist mir klar und ich werde das noch richten wenn ich es sauber mache.
    Bitte immer bedenken: sobald Du solchen Code postest, kann jemand vorbeikommen, dem das nicht klar ist, der ihn kopiert und der sich dann hinterher darüber wundert, was auf seinem Server passiert.

    Carsten

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von BlueM ()