1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

xPath - query mit where functionalität

Dieses Thema im Forum "XML Technologien" wurde erstellt von NetBull, 21. September 2012.

  1. NetBull

    NetBull Erfahrenes Mitglied

    Guten Morgen,

    xPath ist noch recht neu für mich und ich habe ein kleines Verständnis-Problem mit der Syntax.

    Der XML String:
    Code (Text):
    1. <?xml version="1.0"?>
    2. <log>
    3.     <logentry revision="1" node="11234">
    4.         <tag>tip</tag>
    5.         <author email="frst@test.de">first user</author>
    6.         <date>2012-08-07T13:47:02+02:00</date>
    7.         <msg xml:space="preserve">Message 1</msg>
    8.     </logentry>
    9.     <logentry revision="2" node="12324">
    10.         <author email="snd.irgendwo.de">second user</author>
    11.         <date>2012-08-07T13:46:00+02:00</date>
    12.         <msg xml:space="preserve">another message</msg>
    13.     </logentry>
    14. </log>
    Der PHP Code:
    Code (Text):
    1. $xmlString = file_get_contents($xmlFile);
    2.     $xmlDoc = new DOMDocument();
    3.     $xmlDoc->loadXML(utf8_decode($xmlString));
    4.     $xmlDom = new Domxpath($xmlDoc);
    5.     $xmlResult = $xmlDom->query("//logentry/author[@email='frst@test.de']");
    6.     foreach($xmlResult as $iMsg)
    7.         echo $iMsg->textContent."<hr>";
    Funktioniert auch super so das ich den author auflisten kann. Allerdings hätte ich gerne das ich zu dem gesuchten Author die jeweiligen tags auf gleichem Level mit dem author tag ausgebe.

    Also konkret:
    1) date / msg des authors mit der email-kennung 'frst@test.de'
    2) würde ich gerne nach dem inhalt des text node author filtern also alle nodes wo der author = "first user" ist und dann dazu die nodes auf gleicher ebene ausgeben.

    Kann mir jemand an kurzen beispielen zeigen wie das geht? Mir ist das Prinzip klar, nur die Syntax scheint noch nicht mein Freund zu sein.

    LG deAndro

    Nachtrag:

    Habe mittlerweilge einen Weg gefunden:

    SO bekommt man alle Childs des Parent ausgewählten Nodes!
    Code (Text):
    1. $xmlResult = $xmlDom->query("//logentry/author[@email='frst@test.de']/..");
    und so bekommt man ein spezielles childnode des parent des ausgewählten node!
    Code (Text):
    1. $xmlResult = $xmlDom->query("//logentry/author[@email='frst@test.de']/../date");
    Aber wie bekomme ich nun alle Nodes des Parent, so das ich diese wieder mit Ihrem Key ansprechen kann?

    Mit dem folgenden Kostrukt kann ich zwar die Node-Inhalte lesen, aber habe keinen Key mehr das ich sicherstellen kann das ich das Node auslese das ich gerade haben möchte.

    Code (Text):
    1. $xmlResult = $xmlDom->query("//logentry/author[@email='usr@mail.com']/../*");
    2. foreach($xmlResult as $key=>$val)
    3. {  
    4.     echo $key." / ".$val->textContent."<hr>";
    5. }
     
Die Seite wird geladen...