Günni: PHP DOM xPath

Kann man per PHP DOM den xPath eines Elements herausfinden? Z.B.

$a = $xxx->getElementById('test');  
echo $a->getXPath; // z.B.: "der/x/pfad/zum/objekt/test"

Günni

  1. Hi,

    Kann man per PHP DOM den xPath eines Elements herausfinden?

    Nein - es gibt nicht „den“ XPath.
    XPath ist eine query language, also eine Abfragesprache, zum Ermitteln von Daten.
    Die Möglichkeiten, ein Element per XPath zu selektieren, sind vielfältig. Ein Eindeutigkeit, die deine Fragestellung impliziert, ist gar nicht gegeben.

    $a = $xxx->getElementById('test');

    echo $a->getXPath; // z.B.: "der/x/pfad/zum/objekt/test"

      
    Was soll test jetzt sein, die ID eines Elements, oder ein Elementname?  
    Die gleiche Frage gilt für die weiteren Bestandteile innerhalb des angegebenen Beispielpfades - was sollen die darstellen?  
      
    MfG ChrisB  
      
    
    -- 
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    
    1. ok!

      z.B. <test id="test">mein Test</test>

      mit dem xPath "der/x/pfad/zum/objekt/test" soll man das Element ansprechen können. Das Ergebnis soll dann das selbe sein, als ob man das element über getElementById sucht.

      1. Hi,

        z.B. <test id="test">mein Test</test>

        mit dem xPath "der/x/pfad/zum/objekt/test" soll man das Element ansprechen können.

        Noch mal die Frage: Was sollen die einzelnen Bestandteile dieses Pfades darstellen?

        Das Ergebnis soll dann das selbe sein, als ob man das element über getElementById sucht.

        Dann wirst du, sofern alle Bestandteile Elementnamen sein sollen, aber auch ggf. an diversen Stellen noch eine Positionsangabe hinzufügen müssen, wenn du ein Element eindeutig adressieren willst.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Yerf!

          mit dem xPath "der/x/pfad/zum/objekt/test" soll man das Element ansprechen können.

          Noch mal die Frage: Was sollen die einzelnen Bestandteile dieses Pfades darstellen?

          Eine wichtige Frage. Wenn es nur Elemente sein sollen, dann kann man sich den Pfad selber zusammenbauen, indem man rekursiv über die Parents geht.

          Gruß,

          Harlequin

          --
          RIP --- XHTML 2
          nur die Besten sterben jung
          1. Eine wichtige Frage. Wenn es nur Elemente sein sollen, dann kann man sich den Pfad selber zusammenbauen, indem man rekursiv über die Parents geht.

            Wozu soll das gut sein? Wenn ich den Pfad vollständig per Hand angeben muss, brauche ich keine Abfragesprache.

            1. Hi,

              Eine wichtige Frage. Wenn es nur Elemente sein sollen, dann kann man sich den Pfad selber zusammenbauen, indem man rekursiv über die Parents geht.

              Wozu soll das gut sein?

              Das sollte Günni uns erst mal erklären.

              Wenn ich den Pfad vollständig per Hand angeben muss, brauche ich keine Abfragesprache.

              Den Pfad will er ja automatisch ermitteln (um dann anschließend was auch immer damit zu machen).

              Dass es „den Pfad“, so wie er sich das vorstellt, vermutlich gar nicht gibt, versuchen wir ja jetzt gerade erst mal festzustellen.

              MfG ChrisB

              --
              RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
              1. Moin Jungs!

                Das sollte Günni uns erst mal erklären.

                Also gut. Ich werd mal all meine Karten auf den Tisch legen.

                Ich habe ein XML, in die der http Benutzer Eingaben machen kann. Dies geschieht per xslt (inputfelder werden aus den xml-Elementen generiert und per formular abgeschickt) und php (schreiben der Werte ins XML). Der Benutzer gibt also Werte ein und beim Verlassen des Feldes wird dieser Wert in das xml per php-DOM eingefügt und sofort wieder auf das xml weitergeleitet. Das geht ratzfatz und der Benutzer "schreibt auf dem XML".

                Nun hat der Benutzer auch die Möglichkeit seine Eingaben herunterzuladen. Aus diversen Gründen (Validität, Größe) werden dazu alle leeren Elemente und einige Attribute gelöscht. Wenn eine Eingabe in der, sagen wir, vierten Hierarchieebene gemacht wurde, werden also alle Elemente gelöscht, außer das Element mit der Eingabe und dessen Eltern.

                Jetzt kommt die Aufgabe:
                Der Benutzer kann seine abgespeicherte xml auch wieder hochladen und weiter bearbeiten. Dazu müssen natürlich wieder alle Element und Attribute da sein (auch die beim download gelöscht wurden). Dazu habe ich eine leere xml-Datei, in der alle Elemente und Attribute vorhanden sind. Nun merge ich die beiden xml's (die uploadXML und die tempalteXML). Dazu muss ich mir halt die Werte aus der uploadXML greifen und in die richtige Schublade der templateXML stecken. Wenn ich nun einen gefüllten Knoten aus der uploadXML habe, muss ich z.B. den xPath kennen um diesen auf dei templateXML anwenden zu können.

                Puh ... Viel Text aber jetzt wisst Ihr was läuft.

                Günni

                1. Also gut. Ich werd mal all meine Karten auf den Tisch legen.

                  Also Ihr braucht Euch das nicht mehr durchzulesen.

                  fantasyman3000 hat mein Problem schon 2008 gelöst:[link=http://www.php.net/manual/en/book.dom.php#87471]
                  Danke Euch trotzdem!

                  Günni

            2. Yerf!

              Wozu soll das gut sein?

              An der Stelle ist meine Glaskugel noch etwas trüb ;-)

              Gruß,

              Harlequin

              --
              RIP --- XHTML 2
              nur die Besten sterben jung
          2. Hi,

            mit dem xPath "der/x/pfad/zum/objekt/test" soll man das Element ansprechen können.

            Noch mal die Frage: Was sollen die einzelnen Bestandteile dieses Pfades darstellen?

            Eine wichtige Frage.

            Nun, in XPath können damit ja eigentlich nur Elementnamen gemeint sein.

            Wenn es nur Elemente sein sollen, dann kann man sich den Pfad selber zusammenbauen, indem man rekursiv über die Parents geht.

            Sofern entsprechende Eindeutigkeit gegeben ist.

            <root>  
              <blah>  
                <blubb>  
                  <xyz />  
                  <xyz id="test" />  
                  <xyz />  
                </blubb>  
              </blah>  
            <root>
            

            Hier wäre es aber gar nicht möglich, das xyz-Element mit dem Attribut id="test" allein über die Elementnamen eindeutig zu addressieren.

            Ich habe den Verdacht, dass Günni hier entweder eine vorausgesetzte Eindeutigkeit verschweigt, oder sich noch nicht im Klaren darüber ist, was ihr Fehlen für die Adressierbarkeit eines bestimmten Elementes rein über Elementnamen auf dem Pfad bedeutet.

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    2. Kann man per PHP DOM den xPath eines Elements herausfinden?

      Nein - es gibt nicht „den“ XPath.
      XPath ist eine query language, also eine Abfragesprache, zum Ermitteln von Daten.

      Wobei hierzu zu sagen ist, dass XPath als Abfragesprache wesentlich leistungsfähiger und schneller als DOM, wenn es um komplexe Abfragen geht.

      $a = $xxx->getElementById('test');

      echo $a->getXPath; // z.B.: "der/x/pfad/zum/objekt/test"

        
      
      > Die gleiche Frage gilt für die weiteren Bestandteile innerhalb des angegebenen Beispielpfades - was sollen die darstellen?  
        
      Wenn es eine ID ist sollte diese Abfrage zum Ziel führen: //\*[@id='test'] Wobei in DOM getElementById genau ein Element, jenes mit der gegebenen ID zurückliefert. Sollte es mehrere geben ist das Verhalten afaik nicht näher definiert.  
        
      Die genannte XPath-Abfragen hingegen liefert alle Elemente mit einem id-Attribut dessen inhalt "test" ist - dabei ist es für XPath völlig egal ob es mehrere davon gibt oder diese Werte beinhalten die ggf. in der DTD des zu parsenden Dokuments nicht vorgesehen sind.