Neues (DOM-)XML Dokument nach XPath

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Neues (DOM-)XML Dokument nach XPath

    Hi,

    ich habe ein XML-File als Basis, dem durch eine XPath-Query relevante nodes herausgelesen werden sollen, aus denen ein neues XML-File generiert werden soll.

    Konkret sieht das so aus, dass das XML-File Reservierungsdaten eines ganzen Monats enthält, die XPath die Reservierungen eines Tages herausholt und dann ein XML-File mit nur diesen Daten erstellt werden soll.

    XPath::xpath_eval() liefert nur dummerweise einen Array aus DOM-Elementen (keine nodes), mit denen man egtl. gar nichts anfangen kann, da man das DOM-Element nicht dumpen, sondern gerade eben dessen Attribute auslesen kann.

    Seht Ihr noch eine Möglichkeit, ausser der, das komplette XML-File durchzuforsten und nicht passende Nodes zu entfernen?

    Danke!
    Thomas

  • #2
    DOMElements sind nodes (falls du mit node die Klasse DOMNode meinst), soll heißen sie sind davon abgeleitet. Und es ist möglich diese zu "dumpen" (was ich jetzt mal als ausgegeben des XML-Strings dieser Knoten interpretieren würde):
    PHP-Code:
    $Nodes $x->query('foo/bar[@baz = "buz"]')
    for(
    $i 0$i $Nodes->length$i++)
    {
      
    $Node $Nodes->item($i);
      echo 
    $Node->ownerDocument->saveXML($Node);

    Siehe auch http://de2.php.net/manual/en/functio...nt-savexml.php
    und DOMNodeList unter www.php.net/dom
    Zuletzt geändert von Nezzar; 15.06.2005, 15:01.
    "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

    Kommentar


    • #3
      Hi Nezzar,

      danke für die Info - der Haken bei der Sache ist leider, dass ich mich mit PHP4 begnügen muss

      Kommentar


      • #4
        D'oh.
        Hab ich komplett übersehen. Dennoch: Das oben beschriebene ist alltägliche Arbeit (sich durch 'ne DOMNodeList hangeln). Ich bin mir sicher, dass das auch mit der DOMXML-Extension von PHP4 zu bewerkstelligen ist.
        Zum Thema "dumpen" fällt mir dann schon nichts mehr ein (es scheint in DOMXML von PHP4 nicht möglich zu sein einzelne Knoten zu dumpen, korrigiert mich wenn ich falsch liege), außer das hier (was eigentlich ziemlich pfuschig ist):
        • Die DOMNodeList per XPath besorgen
        • DocumentFragment erzeugen(DOMDocument::create_document_fragment)
        • neues DOMDocument erzeugen
        • Root-Knoten im neuen DOMDocument erzeugen
        • DocumentFragment unter dem Root-Knoten einfügen
        • Neues DOMDocument dumpen


        Wie gesagt: das scheint mir nicht die beste Lösung zu sein, aber scheinbar die einzig mögliche.

        Edit: PHP4's DOMXML
        Zuletzt geändert von Nezzar; 16.06.2005, 17:31.
        "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

        Kommentar


        • #5
          create_document_fragment ist ja schon wieder PHP5

          macht aber nix. Meine Lösung ist so schlimm nun auch wieder nicht:
          PHP-Code:
          $nodes $this->dom->get_elements_by_tagname("reservation");
          $schedule $this->schedule->dom->document_element();

                  foreach (
          $nodes as $reservation) {
                      if (
          $reservation->get_attribute('date') != $date) {                
                          
          $schedule->remove_child($reservation);
                      }
                  } 
          damit kann ich eigentlich gut leben. Ich hätte eine XPath Lösung vorgezogen, weil sie leichter anzupassen gewesen wäre. Passt aber trotzdem!

          Grüße und danke!
          Thomas

          Kommentar


          • #6
            Verdammt, bin fest davon ausgegangen, dass es das auch in PHP4 geben würde, da ich die Konstante XML_DOCUMENT_FRAG_NODE in der Doku gesehen hab (also hab ich den Methoden-Namen einfach mal geraten ).
            "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

            Kommentar

            Lädt...
            X