fr@gma: simpleXML Children() mit Index ansprechen

Hallo,

gibt es eine Möglichkeit die Kinder mit simpleXML per Index anzusprechen?
In etwa so:

  
$xml->name[2]->children()[2];  

Also ich möchte von <name> das 3. Kindelement ansprechen.
Habe leider keine Idee mehr.

Vielen Dank für Eure Hilfe.
LG fr@gma

  1. Also ich möchte von <name> das 3. Kindelement ansprechen.
    Habe leider keine Idee mehr.

    Simple XML kann etwas mit XPath anfangen, die XPath-Abfrage sollte dann etwa so[1] aussehen:

    /name[2]/*[2]

    [1] wohl eher nicht, weil in einem wohlgeformten XML-Dokument nur ein Wurzelelement extistieren sollte - name[2] impliziert aber, dass wir hier schon eine ebene zu tief sind - da fehlt etwas.

  2. Hi!

    gibt es eine Möglichkeit die Kinder mit simpleXML per Index anzusprechen?
    $xml->name[2]->children()[2];

    Von Arrays, die von Funktionen zurückgegeben werden, können unter PHP nicht direkt die Elemente angesprochen werden. Das Ablegen in einer Zwischenvariable ist für den Fall erforderlich.

    Lo!

    1. Von Arrays, die von Funktionen zurückgegeben werden, können unter PHP nicht direkt die Elemente angesprochen werden. Das Ablegen in einer Zwischenvariable ist für den Fall erforderlich.

      In SimpleXML ist das noch einen tick komplizierter da sich der geparste XML-Baum aus Objekten und Arrays zusammensetzt - da kanns schnell passieren, dass man ein Array mit einem Objekt verwechselt und so eine zwischenvariable mit einem Objekt befüllt.

      Während sich das Objekt mit print_r wunderbar ausgeben lässt oder man mit echo einen Wert bekommt, kann das an anderer Stelle schon zu Problemen führen.

      Wenn man die Werte z.B. in einer Funktion einsetzt, die einen bestimmten Datentyp erwartet und nicht einfach so selbsttätig castet, kann es sein, dass das Typecasting fehlschlägt:

      Beispiel:
      date('c', $xml->foo[0]->timestamp);

      Würde fehlschlagen, folgendes aber nicht:
      date('c', (string)$xml->foo[0]->timestamp);
      date('c', (int)$xml->foo[0]->timestamp);

      1. Hi!

        In SimpleXML ist das noch einen tick komplizierter da sich der geparste XML-Baum aus Objekten und Arrays zusammensetzt

        Hinzu kommt noch, dass SimpeleXML mit einiger "Magie" arbeitet, so dass Objekte im String-Kontext ausgegeben werden können, sich wie Arrays ansprechen lassen und man darüber iterieren kann. Man selbst kann solch ein Verhalten in seinen Klassen nachbilden, indem man die magische Methode __toString() erstellt oder aus der SPL Interfaces wie ArrayAccess und Iterator (für foreach) implementiert.

        Während sich das Objekt mit print_r wunderbar ausgeben lässt oder man mit echo einen Wert bekommt, kann das an anderer Stelle schon zu Problemen führen.
        Wenn man die Werte z.B. in einer Funktion einsetzt, die einen bestimmten Datentyp erwartet und nicht einfach so selbsttätig castet, kann es sein, dass das Typecasting fehlschlägt:
        Beispiel:
        date('c', $xml->foo[0]->timestamp);

        Da typecastet PHP nicht, weil es in dem Fall keinen String-Kontext erkennen kann. Man kann Funktionsparametern keinen type hint für einfache (skalare) Typen mitgeben, sonst könnte PHP erkennen, dass sich der geforderte Skalar einerseits und das komplexe Objekt andererseits gegenüberstehen und eine eventuell vorhandene __toString()-Methode aufrufen. Untypisierte Sprachen haben eben auch Nachteile.

        Würde fehlschlagen, folgendes aber nicht:
        date('c', (string)$xml->foo[0]->timestamp);
        date('c', (int)$xml->foo[0]->timestamp);

        Mit ''.$xml->... kann ebenfalls der __toString()-Aufruf "provoziert" werden.

        Lo!

        1. Hi,

          Würde fehlschlagen, folgendes aber nicht:
          date('c', (string)$xml->foo[0]->timestamp);
          date('c', (int)$xml->foo[0]->timestamp);

          Mit ''.$xml->... kann ebenfalls der __toString()-Aufruf "provoziert" werden.

          Ein solch impliziter Cast wird ohne weitere Dokumenation aber leicht vom nächsten, der daran arbeiten muss (oder auch von einem selber, wenn man das Script einige Zeit lang nicht angefasst hat), schlicht für unnötigen Nonsense gehalten, und dann entfernt werden.

          Da würd' ich also doch lieber beim expliziten Cast bleiben.

          MfG ChrisB

          --
          Light travels faster than sound - that's why most people appear bright until you hear them speak.
        2. Man kann Funktionsparametern keinen type hint für einfache (skalare) Typen mitgeben [...]

          Ja, leider - obwohl manche Funktionen als Parameter "string" erwarten, casten sie dann seltsamerweise nicht automatisch in diesen Typ.

          Das ist z.B. bei mktime() und date() interessant: beide akzeptieren den Timestamp lediglich als int. Während mktime() brav castet tut es date() nicht.

          Unter der Annahme timestamp und year sind jeweils Objekte mit strings als Inhalt:

          date('c', $xml->foo[0]->timestamp);        //funktioniert nicht  
          mktime(0, 0, 0, 0, 0, $xml->foo[0]->year); // funktioniert
          

          Dass es bei Funktionen die "mixed" akzeptieren nicht funktioniert ist da verständlicher.

    2. Hi dedlfix!

      Von Arrays, die von Funktionen zurückgegeben werden, können unter PHP nicht direkt die Elemente angesprochen werden. Das Ablegen in einer Zwischenvariable ist für den Fall erforderlich.

      danke für Deine Hilfe, so bekomme ich das gewünschte Ergebnis.