ebody: PHP - Funktionsnamen "escapen"

Hallo,

ich habe eine XML Datei, die ich mit simplexml_load_file() einlese. Einige Elemente haben den Namen "date".

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<verzeichnis>
     <eintrag>
          <date>2016-04-18</date>
          <eintragstext>Genf ist der Sitz von ...</eintragstext>
     </eintrag>
</verzeichnis>

Wenn ich darauf jetzt zugreifen möchte: foreach ( $xml->eintrag->date as $datensatz ){...

kommt es zu einer Fehlermeldung:

"Warning: Invalid argument supplied for foreach() in"

Ich denke es hängt damit zusammen, dass ich in der foreach Schleife - date - verwende, was ja eigentlich eine PHP Funktion ist.

Wie kann man das lösen?

Gruß ebody

  1. Tach!

    Wenn ich darauf jetzt zugreifen möchte: foreach ( $xml->eintrag->date as $datensatz ){...

    kommt es zu einer Fehlermeldung:

    "Warning: Invalid argument supplied for foreach() in"

    Ich denke es hängt damit zusammen, dass ich in der foreach Schleife - date - verwende, was ja eigentlich eine PHP Funktion ist.

    Wie kann man das lösen?

    Auf alle Fälle ist, sich was auszudenken und davon ausgehend die Lösung zu suchen, nicht ungbedingt sinnvoll und zielführend. Jedenfalls erwartet PHP hinter dem -> keinen einfachen Funktionsnamen, sondern ein Mitglied des Objekts. Es kommt da zu keinen Konflikten mit gleichnamigen Funktionen. Dein Fehler ist irgendwas anderes, denn wenn ich das nachstelle, bekomme ich ihn nicht, sondern das erwartete Ergebnis. Also schau erstmal nach, was du da an das foreach verfütterst. var_dump() kann dabei helfen. Allerdings hast du es hier mit SimpleXML zu tun, das macht eine ganze Menge mit PHPs Magic-Geschichten und Dingen aus der SPL. Das führt dazu, dass sich manche Dinge anders verhalten, als man es von normalem PHP-Zeugs gewohnt ist. Beispielsweise sieht man mit var_dump($datensatz) ein Objekt, bringt man das in einen String-Kontext (z.B. mit var_dump((string)$datensatz);), dann sieht man das Datum.

    Wie auch immer, schau erstmal nach, was du da an das foreach gibst. Wenn das date wirklich schuld gewesen wäre, dann würde die Fehlermeldung zum var_dump() mitwandern.

    dedlfix.

  2. Hi,

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <verzeichnis>
         <eintrag>
              <date>2016-04-18</date>
              <eintragstext>Genf ist der Sitz von ...</eintragstext>
         </eintrag>
    </verzeichnis>
    

    Wenn ich darauf jetzt zugreifen möchte: foreach ( $xml->eintrag->date as $datensatz ){...

    kann es sein, daß hier ein verzeichnis fehlt?

    cu,
    Andreas a/k/a MudGuard

    1. Tach!

      foreach ( $xml->eintrag->date as $datensatz ){...

      kann es sein, daß hier ein verzeichnis fehlt?

      Klingt gut, deswegen hast du wohl auch einen Pluspunkt bekommen. Ist aber nicht der Fall. $xml ist nicht das XML-Document - das ist in SimpleXML ausgespart -, sondern bereits das Root-Element. Siehe: $xml->getName()

      dedlfix.

      1. Hi,

        Klingt gut, deswegen hast du wohl auch einen Pluspunkt bekommen. Ist aber nicht der Fall. $xml ist nicht das XML-Document - das ist in SimpleXML ausgespart -, sondern bereits das Root-Element. Siehe: $xml->getName()

        Ok, war ja auch nur eine Vermutung meinerseits. Ich hätte erwartet, daß $xml das Gesamtdokument ist - sonst kommt man ja gar nicht an die XML-Deklaration usw.

        cu,
        Andreas a/k/a MudGuard

        1. Tach!

          Ich hätte erwartet, daß $xml das Gesamtdokument ist - sonst kommt man ja gar nicht an die XML-Deklaration usw.

          Das ist offensichtlich nicht Ziel von SimpleXML. Es soll einfach sein, und die XML-Deklaration hat üblicherweise keinen gesteigerten Nutzen. Braucht man den vollen Funktionsumfang von XML, sollte man sich bei der DOM extension umschauen. Es gibt auch die beiden Funktionen dom_import_simplexml() und simplexml_import_dom() zum Hin- und Herschalten zwischen beiden.

          dedlfix.