andi d: simplexml -> count geht nicht wie gewünscht

Hallo,
ich versuche gerade die Anzahl der Einträge in einer XML herauszufinden.

  
  
if (file_exists('XML/customer.xml')) {  
$xml = simplexml_load_file('XML/customer.xml');  
$counter = count($xml->xpath("/data/customer"));  
echo $counter;

Die XML sieht so aus:

  
<data name="data">  
	<customer name="aaa"></customer>  
	<customer name="bbb"></customer>  
	<customer name="ccc"></customer>  
</data>

Funktionert so leider nicht. Weiß jemand warum?

Danke, Andi

  1. Hi!

    Funktionert so leider nicht. Weiß jemand warum?

    "Funktioniert nicht" funktioniert nicht als nachvollziehbare Beschreibung eines Fehlers. Ich erhalte 3 als Ergebnis. Bleiben die üblichen Verdächtigen: Hast du das error_reporting auf E_ALL (und display_errors auf on) stehen? Hast du Kontrollausgaben mit var_dump() angefertigt? Was ergibt beispielsweise var_dump($xml->xpath("/data/customer")), ein Array mit drei Elementen oder was ganz anderes?

    Lo!

    1. Hi

      Ich erhalte 3 als Ergebnis.

      Ah. Ok, das zeigt mir ja schonmal, das am code eigentl. alles i.O. ist.

      Was ergibt beispielsweise var_dump($xml->xpath("/data/customer")), ein Array mit drei Elementen oder was ganz anderes?

        
      echo "vorher";  
      //$counter = count($xml->xpath("/data/customer"));  
      var_dump($xml->xpath("/data/customer"));  
      echo "nachher";  
      
      

      Ausgabe: vorher

      In der der var_dump-Zeile brichts also irgendwie ab. Mit der $counter-Zeile passiert im übrigen das selbe. Das zweite echo(); wird gar nciht mehr aufgerufen.

      Bleiben die üblichen Verdächtigen: Hast du das error_reporting auf E_ALL (und display_errors auf on) stehen?

      Da muss ich mich erst mal schlau machen, was das ist / wie das geht :)

      aber danke soweit
      andi

      1. Hi!

        In der der var_dump-Zeile brichts also irgendwie ab. Mit der $counter-Zeile passiert im übrigen das selbe. Das zweite echo(); wird gar nciht mehr aufgerufen.

        Sieht nach einen fatalen Abbruch aus. Das passiert im laufenden Betrieb (also wenn das Script schon gestartet ist) eigentlich nur, wenn Ressourcen nicht ausreichend.

        Bleiben die üblichen Verdächtigen: Hast du das error_reporting auf E_ALL (und display_errors auf on) stehen?
        Da muss ich mich erst mal schlau machen, was das ist / wie das geht :)

        Eines der wichtigsten Konfigurationen beim PHP-Entwickeln. Ich schreibe das generell so unpräzise, weil es verschiedene Arten gibt, diese Werte zu setzen. Angefangen von der php.ini über verzeichnisindividuelle Konfgurationen je nach Art der PHP-Einbindung im Webserver, bis hin zu Funktionsaufrufen im Script. Für Fehler beim Scriptstart kommt eine Konfiguration _im_ Script zu spät, aber in deinem Fall könnte

        error_reporting(E_ALL);
          ini_set('display_errors', 1);

        schon reichen, wenn denn PHP was mitteilen will. Du kannst auch mal in einer phpinfo()-Ausgabe nachsehen, wie diese beiden Werte eingestellt sind.

        Lo!

        1. Hi nochmal und Danke!

          error_reporting(E_ALL);
            ini_set('display_errors', 1);

          Das hab ich gemacht. Ich erhalte einen Haufen Fehlermeldungen (was seltsam ist, denn auf einer anderen Unterseite mit einem andere XML-File hab ich keine Probleme!!).

            
          Warning: simplexml_load_file() [function.simplexml-load-file]: XML/customer.xml:12: parser error : xmlParseEntityRef: no name in /home/www/web2/html/kunden/datasource.php on line 68  
            
          ...  
          Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home/www/web2/html/kunden/datasource.php on line 68  
          vorher  
          Fatal error: Call to a member function xpath() on a non-object in /home/www/web2/html/kunden/datasource.php on line 71  
          
          

          Nochmal das Script mit Zeilennummern:

            
          67: if (file_exists('XML/customer.xml')) {  
          68: $xml = simplexml_load_file('XML/customer.xml');  
          69: echo "vorher";  
          70: //var_dump($xml->xpath("/data/customer"));  
          71: $counter_x = count($xml->xpath("/data/customer"));  
          72: echo $counter_x;  
          73: echo "nachher";
          

          Wie gesagt: an anderer Stelle funktioniert es (eigentlich ohne große Veränderung!?!?).

          Noch nen Tipp?
          Andi

          1. Hi!

            Ich erhalte einen Haufen Fehlermeldungen (was seltsam ist, denn auf einer anderen Unterseite mit einem andere XML-File hab ich keine Probleme!!).

            Dann ist das andere XML-File im Gegensatz zu diesem problemlos verarbeitbar.

            [code lang=php]
            Warning: simplexml_load_file() [function.simplexml-load-file]: XML/customer.xml:12: parser error : xmlParseEntityRef: no name in /home/www/web2/html/kunden/datasource.php on line 68

            Fehler im XML. Scheint, dass du da ein Entity nicht richtig notiert hast.

            Fatal error: Call to a member function xpath() on a non-object in /home/www/web2/html/kunden/datasource.php on line 71

            Das ist dann ein Folgefehler. Du hast ignoriert, dass dir simplexml_load_file() aufgrund des Fehlers ein false geliefert hat. Ein false hat keine Methode xpath(). PHP hat Recht.

            <Gebetsmühle>Rückgabewerte der Funktionen nicht ignorieren!</Gebetsmühle>

            Lo!

            1. Hallo nochmal

              Fehler im XML. Scheint, dass du da ein Entity nicht richtig notiert hast.

              Ok, ich konnte dank Deiner Hikfe endlich den Fehler finden. Alle Einträge, in denen ein & vorkommt, mach(t)en Probleme. Wieso eigentlich? Muss ich das zwingend maskieren? -> &amp;?

              andi

              1. Hi!

                Alle Einträge, in denen ein & vorkommt, mach(t)en Probleme. Wieso eigentlich? Muss ich das zwingend maskieren? -> &amp;?

                Ja, da ist XML strenger als HTML. Über ungültige HTML-Syntax liest ein Browser hinweg, aber ein XML-Parser stellt seine Arbeit ein.

                Lo!

                1. Ja, da ist XML strenger als HTML. Über ungültige HTML-Syntax liest ein Browser hinweg, aber ein XML-Parser stellt seine Arbeit ein.

                  Alles klar. Danke Dir! Jetzt läuft alles wie gewünscht :-)