frankx: XML - simple,Dom...,DOMDocument Wertezugriff

Hellihello

mit SimpleXML lässt sich ja schön simpel auf Werte zugreifen. Mit var_dump erhalte ich auch eine komplette übersicht der Struktur.

Mit DOMDocument->DocumentElement gibts den Zugriff auf das Wurzel-Element; var_dump(wurzel) sagt mit, das sei jetzt ein DOMElement - mehr nicht (;-(;

wenn ich jetzt auf $knoten=$wurzel->getElementsById('knoten') anwende, erhalte ich ein Objekt vom Typ DOMNodeList.

Auch wenn es mit foreach ($knoten as $key $value) die $keys ausgibt, kann auf die einzelnen Elemente nicht per Arrayzugriff $knoten[0] zugegriffen werden.

mit foreachsschleife durch die NodeList, kann ich mit
  echo $value->getAttribute('status');
  echo $value->nodeValue;
auf das Attribut des Knoten und auf seinen kompletten Inhalt zugreifen, bzw. gibt er mit die nodeValues der Unterknoten aus.

Wie aber greife ich auf den Inhalte von <unterknoten1> zu und wie verändere ich diesen Wert bzw. analog wie greife ich direkt auf knoten 1 zu, was mit simpleXML mit $xmldoc->knoten[0] bzw. $xmldoc->knoten[0]->unterknoten1 geht?

Warum sind in meinem Manual einige Funktionen fast ident:
DOMElement->getAttribute()
DomElement->get_attribute()
? Ist DOMDocument PHP5 und DomElement Vorgänger?

Macht es Sinn, das einfache auslesen und updaten von Variablen überhaupt über DOMDocument zu realisieren, oder sollt mensch das lediglich zum Eingreifen/Erweitern/Modifizieren der Struktur nehmen, bzw. validieren und parsen mit xslts, und das Variablen-Update mit SimpleXML machen?

Dank und Sonntaxgruss,

frankx

  1. Hallo frankx.

    wenn ich jetzt auf $knoten=$wurzel->getElementsById('knoten') anwende, erhalte ich ein Objekt vom Typ DOMNodeList.

    Auch wenn es mit foreach ($knoten as $key $value) die $keys ausgibt, kann auf die einzelnen Elemente nicht per Arrayzugriff $knoten[0] zugegriffen werden.

    Versuche einmal Folgendes:

    $knoten->[link:http://de2.php.net/manual/de/function.dom-domnodelist-item.php@title=item](0)

    (Ja, ich finde es auch unsinnig, dass getElementById, welches zwangsläufig nur ein Objekt zurück geben kann, dennoch nur per Index auf den Wert zugreifen lässt.)

    Wie aber greife ich auf den Inhalte von <unterknoten1> zu und wie verändere ich diesen Wert bzw. analog wie greife ich direkt auf knoten 1 zu, was mit simpleXML mit $xmldoc->knoten[0] bzw. $xmldoc->knoten[0]->unterknoten1 geht?

    PHPs DOM verhält sich analog zum JS-DOM, d. h. du kannst ebenso mit firstChild, nodeValue und dergleichen agieren.

    Warum sind in meinem Manual einige Funktionen fast ident:
    DOMElement->getAttribute()
    DomElement->get_attribute()
    ? Ist DOMDocument PHP5 und DomElement Vorgänger?

    Siehe Handbuch zu den DOM-Funktionen:

    The DOM extension is the replacement for the DOM XML extension from PHP 4. The extension still contains many old functions, but they should no longer be used. In particular, functions that are not object-oriented should be avoided.

    Macht es Sinn, das einfache auslesen und updaten von Variablen überhaupt über DOMDocument zu realisieren, oder sollt mensch das lediglich zum Eingreifen/Erweitern/Modifizieren der Struktur nehmen, bzw. validieren und parsen mit xslts, und das Variablen-Update mit SimpleXML machen?

    Das musst du entscheiden. Vieles lässt sich bereits mit simpleXML bewerkstelligen, doch wenn eine komplexe Manipulation des Dokumentenbaumes erforderlich ist, ist DOMDocument IMHO besser geeignet.

    Einen schönen Sonntag noch.

    Gruß, Ashura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    mathbr:del.icio.us/ mathbr:w00t/
    1. Hellihello Ashura,

      Versuche einmal Folgendes:

      $knoten->[link:http://de2.php.net/manual/de/function.dom-domnodelist-item.php@title=item](0)

      Jap, dann bekomme ich mit (0) einen leeren String, dass sind wohl die Whitspaces vor dem ersten echten knoten, und dann mit (1) den kompletten Stringinhalt vom <knoten>, ohne die <unterknoten> Elemente.

      Wie aber greife ich auf den Inhalte von <unterknoten1> zu und wie verändere ich diesen Wert bzw. analog wie greife ich direkt auf knoten 1 zu, was mit simpleXML mit $xmldoc->knoten[0] bzw. $xmldoc->knoten[0]->unterknoten1 geht?

      PHPs DOM verhält sich analog zum JS-DOM, d. h. du kannst ebenso mit firstChild, nodeValue und dergleichen agieren.

      Ah, mit

        
       $unterknoten2liste=$wurzel->getElementsByTagName('unterknoten2');  
       foreach ($unterknoten2liste as $internerkey => $unterknoten2) {  
        $value->nodeValue="abc";  
       }  
      
      

      lässt sich zumindest die Knotenliste durchlaufen, und das nodeValue anpassen. Wie aber mache ich es, wenn ich vorher den unterknoten1 auf  einen Wert checken möchte? Im Grunde also, durchlaufe alle <knoten> (die <unterknoten1> und <unterknoten2> enthalten) und checke den wert von <unterknoten1> und setze entsprechend den wert bei <unterknoten2>. Dadurch, dass es keine Arrays sind, kann ich ja nicht den gefundenen $internerkey aus der Nodelist1 als key für Nodelist2 nehmen.

      Dank und Gruß und schönerSonntag

      frankx

      1. Hellihello,

        kleine Korrektur:

          
          $unterknoten2liste=$wurzel->getElementsByTagName('unterknoten2');  
          foreach ($unterknoten2liste as $internerkey => $unterknoten2) {  
           $unterknoten2->nodeValue="abc";  
          }  
        
        

        Dank und Gruß und schönerSonntag

        frankx

      2. Hallo frankx.

        Jap, dann bekomme ich mit (0) einen leeren String, dass sind wohl die Whitspaces vor dem ersten echten knoten, und dann mit (1) den kompletten Stringinhalt vom <knoten>, ohne die <unterknoten> Elemente.

        Dann hast du aber auf keinen Fall getElementsByTagName() aus DOM sondern child_nodes() aus DOM XML genutzt.
        Ersteres liefert nur Elementknoten, ein leerer String kann hier also nicht zurück gegeben werden.

        Wie aber mache ich es, wenn ich vorher den unterknoten1 auf  einen Wert checken möchte?

        Wie gesagt, in dem du dir Zugriff auf diesen Knoten verschaffst; der Wert ist nichts weiter als ein Textknoten, steht also als Kindelement des jeweiligen Elementknotens zur Verfügung.

        Einen schönen Sonntag noch.

        Gruß, Ashura

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        mathbr:del.icio.us/ mathbr:w00t/
        1. Hellihello Ashura,

          Dann hast du aber auf keinen Fall getElementsByTagName() aus DOM sondern child_nodes() aus DOM XML genutzt.
          Ersteres liefert nur Elementknoten, ein leerer String kann hier also nicht zurück gegeben werden.

          jap.

          Wie aber mache ich es, wenn ich vorher den unterknoten1 auf  einen Wert checken möchte?

          Wie gesagt, in dem du dir Zugriff auf diesen Knoten verschaffst; der Wert ist nichts weiter als ein Textknoten, steht also als Kindelement des jeweiligen Elementknotens zur Verfügung.

          Also ich kriegs nicht in die Birne.

          mit

            
            
           $knoten=$wurzel->getElementsByTagName('knoten');  
           foreach ($knoten as $node) {  
           echo $node->nodeName."\n";  
             foreach($node->childNodes as $cnode) {  
               if($cnode->nodeType == 1) {  
               if ($cnode->nodeName=="unterknoten1" && $cnode->nodeValue=="unterknoten11") {  
                // wie kann ich jetzt den wert von unterknoten2 setzte???  
               };  
               print $cnode->nodeName .": ". $cnode->textContent . "\n";  
               }  
             }  
           }  
          
          

          klapper ich alle unterknoten der <knoten> ab. Jetzt möchte ich, wenn

            
          <knoten>  
            <unterknoten1>soll gecheckt werden</unterknoten1>  
            <unterknoten2>soll geänder werden</unterknoten2>  
          </knoten>  
          
          

          eben beim erreichen und checken des unterknoten1 den wert von unterknoten2 ändern. Ich weiß nicht, wie ich in der obigen Schleife das praktizieren kann, da ich ja mit getElementsByTagName nicht auf einen bestimmten Knoten sondern zugriff auf eine Liste kriege.

          Bei simplexml sag ich für alle knoten im knotenarray, wenn knoten->unterknoten1==irgendwas dann knoten-unterknoten2=wasanderes.

          Mit item bin ich ja auch etwas Neese, weil das ja white-spaces mitnimmt und zudem auch etwas "blind" agiert. Ich kenn ja den Namen in und den Pfad in der Baumstruktur? Was  denk ich falsch?
          Dank und Gruß,
          frankx

          1. Hallo frankx.

            Was  denk ich falsch?

            Vielleicht hilft dir dieses (nicht sonderlich saubere) Beispiel weiter:

            <?php  
              
            error_reporting(E_ALL);  
            header('content-type: text/plain; charset=utf-8');  
              
            $str_doc = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>  
            <!DOCTYPE knoten>  
            <knoten>  
              <unterknoten1>CheckMe</unterknoten1>  
              <unterknoten2>ChangeMe</unterknoten2>  
            </knoten>';  
              
            $obj_doc = new DOMDocument(); // Neues Objekt erzeugen  
            $obj_doc->loadXML($str_doc); // Obigen String hineinladen  
              
            $obj_nodes = $obj_doc->documentElement->getElementsByTagName('*'); // Alle Kindknoten des Root-Elementes einfangen  
              
            foreach ($obj_nodes as $obj_node) { // Ausgeben, was gefunden wurde  
              echo '<'.$obj_node->tagName.'>'.$obj_node->nodeValue.'</'.$obj_node->tagName.">\n";  
            }  
              
            // Sofern der Tagname des ersten gefangenen Knotens „unterknoten1“ und sein Wert „CheckMe“ ist  
            if ($obj_nodes->item(0)->tagName == 'unterknoten1' && $obj_nodes->item(0)->nodeValue == 'CheckMe') {  
              $obj_nodes->item(1)->nodeValue = 'YouMadeIt'; // Wert des zweiten Unterknotens manipulieren  
            }  
              
            echo "\n";  
              
            foreach ($obj_nodes as $obj_node) { // Ausgeben, wie das ganze nun aussieht  
              echo '<'.$obj_node->tagName.'>'.$obj_node->nodeValue.'</'.$obj_node->tagName.">\n";  
            }  
              
            ?>
            

            Ich habe versucht, den Code ein wenig zu erläutern; sag' was du nicht verstehst. (Wie ich bereits sagte, ist das PHP-DOM dem JS-DOM sehr ähnlich, wenn man bereits Umgang mit zweiterem hat, macht sich dies folgerichtig bei ersterem bezahlt.)
            Die Ausgabe ist wie von dir wahrscheinlich gewünscht:

            <unterknoten1>CheckMe</unterknoten1>
            <unterknoten2>ChangeMe</unterknoten2>

            <unterknoten1>CheckMe</unterknoten1>
            <unterknoten2>YouMadeIt</unterknoten2>

            Einen schönen Sonntag noch.

            Gruß, Ashura

            --
            sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
            mathbr:del.icio.us/ mathbr:w00t/
            1. Hallo Ingrid.

              $obj_nodes = $obj_doc->documentElement->getElementsByTagName('*'); // Alle Kindknoten des Root-Elementes einfangen

              Kleiner Fehler im Kommentar: es sind natürlich *nicht* einfach nur die Kindknoten, sondern einzig und allein die Elementknoten, womit wir uns um Textknoten keine Gedanken mehr machen müssen.

              Einen schönen Sonntag noch.

              Gruß, Ashura

              --
              sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
              mathbr:del.icio.us/ mathbr:w00t/
            2. Hellihello Ashura,

              besten Dank für das Beispielscript. Es läuft und mir ist jetzt klar, dass es mit DOMDocument nur über das Anfahren der Elternknoten geht und innerhalb muss dann die Struktur klar sein, damit die Element über item und ihre Reihenfolge geortet werden können. (Javascript und DOM hab ich noch keine Erfahrung, das macht es nicht einfacher, ist klar).

              Wenn ich also den Index und einen Eintrag in der Reihenfolge vertausche, müsste ich auch das Script anpassen. Es macht demzufolge wohl Sinn, zwischen SimpleXML und DOMDocument zu switchen, denn für denn wahrlich direkten und simplen Zugriff auf die Variablenwerte bietet DOM ja, kann man wohl so sagen, keine wirklich praktikable Alternative. DOM dann also, wenn es darum geht, neue Knoten/Elemente/Attribute zu generieren und einzufügen (oder zu entfernen) bzw. auf Valitität (mittels DTD) zu "parsen" (?) und XSLTs einzubinden/zu parsen (weiß nicht, wann "parsen" da der richtige Ausdruck ist).

              Also besten Dank nochmal für die Mühe,

              frankx

              Ps. Warum nennst Du mich im Korrekturpost "Ingrid" (;-)

              1. Hallo frankx.

                Wenn ich also den Index und einen Eintrag in der Reihenfolge vertausche, müsste ich auch das Script anpassen.

                Alternativ kannst du natürlich auch alle Elementknoten abklappern und z. B. per strstr() deinen gewünschten Tagnamen suchen lassen. Aber dies kann je nach Umfang des Dokumentes recht träge sein. Daher ist es von Vorteil, wenn die Struktur feststeht und bekannt ist.

                Es macht demzufolge wohl Sinn, zwischen SimpleXML und DOMDocument zu switchen, denn für denn wahrlich direkten und simplen Zugriff auf die Variablenwerte bietet DOM ja, kann man wohl so sagen, keine wirklich praktikable Alternative.

                Man kann sich ja eine eigene Klasse schreiben, die das ganze vereinfacht. Zumindest für einen schreibenden Zugriff habe ich schon einmal so etwas geschrieben. Das Lesen führe aber auch ich nach wie vor per simpleXML durch.

                DOM dann also, wenn es darum geht, neue Knoten/Elemente/Attribute zu generieren und einzufügen (oder zu entfernen)

                Absolut.

                bzw. auf Valitität (mittels DTD) zu "parsen" (?)

                Ja, ist möglich. (Bei simpleXML auch über einen Umweg.)

                und XSLTs einzubinden/zu parsen (weiß nicht, wann "parsen" da der richtige Ausdruck ist).

                Einbinden: ja.
                Zum Durchführen der Transformationen per XSLT ist aber AFAIK ein richtiger Parser auf serverseite erforderlich.

                Ps. Warum nennst Du mich im Korrekturpost "Ingrid" (;-)

                Aber dich doch nicht.

                Einen schönen Sonntag noch.

                Gruß, Ashura

                --
                sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                mathbr:del.icio.us/ mathbr:w00t/
                1. Hellihello Ashura

                  Alternativ kannst du natürlich auch alle Elementknoten abklappern und z. B. per strstr() deinen gewünschten Tagnamen suchen lassen. Aber dies kann je nach Umfang des Dokumentes recht träge sein. Daher ist es von Vorteil, wenn die Struktur feststeht und bekannt ist.

                  Wenn ich zB. eine <Artikelliste> habe, darin viele <Artikel>, mit <Index> an Position 1 und <Verfügbarkeit> an Position 2 (mal abgesehen davon, dass der Index vielleicht schlauerweise dem Artikel als Attribut zugeordnet sein sollte), könnte  ich also nur direkt zugreifen mit via  zwei mal Nodelist mit

                    
                  $liste=getElementsByTagName('Artikel');  
                  $artikel_15_Eigenschaften=$liste->item(14)->getElementsByTagName('*');  
                  $indexValue=$artikel_15_Eigenschaften->item(0)->nodeValue;  
                  $verfuegbarkeitValue=$artikel_15_Eigenschaften->item(1)->nodeValue;  
                  
                  

                  Javascript stellt da im Gegensatz gleich Arrays zur Verfügung, oder?

                  schönen Montag,

                  frankx

                  1. Hallo frankx.

                    Wenn ich zB. eine <Artikelliste> habe, darin viele <Artikel>, mit <Index> an Position 1 und <Verfügbarkeit> an Position 2 (mal abgesehen davon, dass der Index vielleicht schlauerweise dem Artikel als Attribut zugeordnet sein sollte), könnte  ich also nur direkt zugreifen mit via  zwei mal Nodelist mit

                    Du könntest ggf. auch gleich per getElementsByTagName("Index") und getElementsByTagName("Verfügbarkeit") auf die jeweiligen Elementknoten zugreifen.

                    Javascript stellt da im Gegensatz gleich Arrays zur Verfügung, oder?

                    Nein, das Handling von JS-DOM ist mit PHP-DOM identisch. In beiden kannst du dir nicht einfach so mit einem einzigen Befehl die gesamte Baumstruktur ausgeben lassen und erwarten, dass diese zeitgleich eine Ansammlung referenzierbarer Knoten darstellt.

                    Im Gegenteil: wie du an meinem Beispiel gesehen hast, musst du nicht einmal zwangsläufig mit firstChild arbeiten, nodeValue steht sofort als Eigenschaft des Elementknotens zur Verfügung, wohingegen in JS zuallererst mit firstChild zum Textknoten im Elementknoten gewechselt werden muss.

                    Einen schönen Montag noch.

                    Gruß, Ashura

                    --
                    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                    mathbr:del.icio.us/ mathbr:w00t/
                    1. Hellihello Ashura,

                      Javascript stellt da im Gegensatz gleich Arrays zur Verfügung, oder?

                      Nein, das Handling von JS-DOM ist mit PHP-DOM identisch. In beiden kannst du dir nicht einfach so mit einem einzigen Befehl die gesamte Baumstruktur ausgeben lassen und erwarten, dass diese zeitgleich eine Ansammlung referenzierbarer Knoten darstellt.

                      Im Gegenteil: wie du an meinem Beispiel gesehen hast, musst du nicht einmal zwangsläufig mit firstChild arbeiten, nodeValue steht sofort als Eigenschaft des Elementknotens zur Verfügung, wohingegen in JS zuallererst mit firstChild zum Textknoten im Elementknoten gewechselt werden muss.

                      Mmh, ich dachte jetzt, dass es dann doch ident ist:

                        
                      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
                          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
                      <html xmlns="http://www.w3.org/1999/xhtml">  
                       <head>  
                        <title>get Elements js</title>  
                        <script type="text/javascript">  
                        //<![CDATA[  
                        var elements = function () {  
                         alleLis = document.getElementsByTagName('li');  
                         alleAs = alleLis[4].getElementsByTagName('*');  
                          alert (alleAs[1].innerHTML);  
                         }  
                        //]]>  
                        </script>  
                        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">  
                       </head>  
                       <body>  
                        <ul>  
                        <li>li1</li>  
                        <li>li2</li>  
                        <li>li3</li>  
                        <li>li4</li>  
                        <li>  
                         <a>A1</a>  
                         <a>A2</a>  
                         <a>A3</a>  
                        </li>  
                        <li>li6</li>  
                        <li>li7</li>  
                        <li>li8</li>  
                        <li>li9</li>  
                        <ul>  
                        <button onclick="elements()">elements()</button>  
                       </body>  
                      </html>  
                      
                      

                      Gruß,

                      frankx

                      1. Hallo frankx.

                        Mmh, ich dachte jetzt, dass es dann doch ident ist:

                        Nein, ist es eben gerade in dieser Hinsicht nicht, wie du am <http://de.selfhtml.org/javascript/objekte/node.htm#node_value@title=Beispiel von nodeValue in SELFHTML> erkennen kannst. Entfernst du das „firstChild“, erhältst du nur eine Fehlermeldung.

                        alert (alleAs[1].innerHTML);

                        Dass du *damit* an den Inhalt kommst, ist nicht weiter verwunderlich; mit innerHTML kannst du nahezu alles ausgeben, egal wo du dich gerade befindest.

                        Einen schönen Montag noch.

                        Gruß, Ashura

                        --
                        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                        mathbr:del.icio.us/ mathbr:w00t/
                        1. Hellihello Ashura,

                          besten Dank nochmal, jetzt hab ichs glaub ich soweit dank Deiner Hilfe.

                          Schönen Restmontag,

                          frankx

                    2. Hellihello Ingrid.

                      Du könntest ggf. auch gleich per getElementsByTagName("Index") und getElementsByTagName("Verfügbarkeit") auf die jeweiligen Elementknoten zugreifen.

                        
                      $index_nodes = $obj_doc->documentElement->getElementsByTagName('index');  
                      $eintrag_nodes = $obj_doc->documentElement->getElementsByTagName('eintrag');  
                        
                      foreach ($index_nodes as $key => $obj_node) {  
                       if ($obj_node->nodeValue == "I2") echo $position = $key;  
                      }  
                      echo $eintrag_nodes->item($position)->nodeValue;  
                      
                      

                      oder?

                      Gruß,

                      frankx

                      1. Hallo frankx.

                        $index_nodes = $obj_doc->documentElement->getElementsByTagName('index');
                        $eintrag_nodes = $obj_doc->documentElement->getElementsByTagName('eintrag');

                        foreach ($index_nodes as $key => $obj_node) {
                        if ($obj_node->nodeValue == "I2") echo $position = $key;
                        }
                        echo $eintrag_nodes->item($position)->nodeValue;

                        
                        > oder?  
                          
                        Da du es sicher ausprobiert hast und gemerkt hast, dass es funktioniert, muss ich eigentlich nichts mehr dazu sagen.  
                        Nur zwei Dinge; zum einen:  
                          
                        Wie in JS kannst du getElementsByTagName überall verwenden. Wenn du, wie hier, einfach nur den Zugriff auf die betreffenden Elementknoten willst, musst du documentElement nicht verwenden, da unnötig.  
                          
                        Hier einmal in JS:  
                        `var index_nodes = document.getElementsByTagName('index');`{:.language-javascript}  
                          
                        Und nun in PHP:  
                        `$index_nodes = $obj_doc2->getElementsByTagName('index');`{:.language-php}  
                          
                        Du siehst, dass das Resultat identisch ist. Die getElementsByTagName-Methode solltest du nur direkt an ein Elementobjekt anhängen, wenn du auch wirklich nur Kindelemente in diesem Elementobjekt haben möchtest und nicht alle aus dem gesamten Dokument.  
                          
                        Nun zum anderen:  
                        Die vorliegende Struktur erscheint mir nicht sonderlich sinnvoll. Ich würde die betroffenen Daten in ein zusammenfassendes Element verpacken und diesem als [Attributwert](http://de2.php.net/manual/de/function.dom-domelement-getattribute.php) den Index verpassen. Wenn dir dies die Verarbeitung aber zu sehr erschwert, kannst du natürlich auch deine derzeitige Struktur beibehalten.  
                          
                          
                        Einen schönen Montag noch.  
                          
                        Gruß, Ashura  
                        
                        -- 
                        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|  
                        [<mathbr:del.icio.us/>](http://del.icio.us/mathbr) [<mathbr:w00t/>](http://w00t.noctus.net)
                        
                        1. Hellihello Ashura,

                          Nun zum anderen:
                          Die vorliegende Struktur erscheint mir nicht sonderlich sinnvoll. Ich würde die betroffenen Daten in ein zusammenfassendes Element verpacken und diesem als Attributwert den Index verpassen.

                          Jap, ich hatte bisher nicht kapiert, wann eine Variable als Attribut besser aufgehoben als als Index. Jetzt dämmerts langsam. Ich vermute, dass der Zugriff via XPath übers Attribut auch simpler ist. Hab das schon mal irgendwo gesehen.

                          Dank und Gruß,

                          frankx

              2. Hallo frankx.

                […] denn für denn wahrlich direkten und simplen Zugriff auf die Variablenwerte bietet DOM ja, kann man wohl so sagen, keine wirklich praktikable Alternative.

                Hierzu hatte ich noch etwas vergessen:

                Wie simpel, direkt und praktikabel es dir erscheint, kann ich nicht einschätzen, aber eine meiner Einschätzung nach sehr gute Alternative stellt XPath dar.

                Einen schönen Montag noch.

                Gruß, Ashura

                --
                sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                mathbr:del.icio.us/ mathbr:w00t/
                1. Hellihello Ashura,

                  Wie simpel, direkt und praktikabel es dir erscheint, kann ich nicht einschätzen, aber eine meiner Einschätzung nach sehr gute Alternative stellt XPath dar.

                  Na ich dachte, erstmal die Struktur kapieren, dann die query-Möglichkeiten (;-)

                  Einen schönen Montagabend,

                  Gruß

                  frankx

                2. Hellihello,

                  Wie simpel, direkt und praktikabel es dir erscheint, kann ich nicht einschätzen, aber eine meiner Einschätzung nach sehr gute Alternative stellt XPath dar.

                  Jap:

                    
                  $query = '//artikel[index="I1"]/eintrag';  
                  $entries = $xpath->query($query);  
                  $entries->item(0)->nodeValue="wasanderes";  
                  
                  

                  Da ist es fast sparsamer, den Index als Element zu positionieren, weil als Attribut obiger Ausdruck noch ein "@" zusätzlich hätte. Simpler außer mit SimpleXML gehts wohl nicht. Der Zugriff via item(0)-> bleibt wohl, weil die queries immer eine NodeList zurückgeben?

                  Einen schönen Dienstagabend noch.

                  frankx

                  1. Hallo frankx.

                    Der Zugriff via item(0)-> bleibt wohl, weil die queries immer eine NodeList zurückgeben?

                    Ja, zwangsläufig.
                    Zitat aus der entsprechenden Manual-Seite (ich weiß, dass du diese schon längst gelesen hast):

                    DOMNodeList query ( string expression [, DOMNode contextnode] )
                    ^^^^^^^^^^^-Rückgabetyp
                    }

                    Einen schönen Dienstag noch.

                    Gruß, Ashura

                    --
                    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                    mathbr:del.icio.us/ mathbr:w00t/
  2. Hallo,

    Mit DOMDocument->DocumentElement gibts den Zugriff auf das Wurzel-Element; var_dump(wurzel) sagt mit, das sei jetzt ein DOMElement - mehr nicht (;-(;

    Äh? Was hättest du erwartet?

    wenn ich jetzt auf $knoten=$wurzel->getElementsById('knoten') anwende, erhalte ich ein Objekt vom Typ DOMNodeList.

    Das glaube ich nicht. Es gibt kein getElementsById, sondern nur getElementById und das gibt niemals eine DOMNodeList zurück. Meinst du vielleicht getElementsByTagName?

    Auch wenn es mit foreach ($knoten as $key $value) die $keys ausgibt, kann auf die einzelnen Elemente nicht per Arrayzugriff $knoten[0] zugegriffen werden.

    Es gibt halt kein DOM-Binding für PHP, das das festlegt.

    Wie aber greife ich auf den Inhalte von <unterknoten1> zu

    Du meinst das Kindelement mit dem Namne unterknoten?
    $elementknoten->getElementsByTagName('unterknoten1')->item(X)
    oder ähnlich. Wenn du genau weißt, wo der Knoten liegt, kannst du natürlich auch mit firstChild, childNodes usw. vorgehen

    und wie verändere ich diesen Wert bzw. analog wie greife ich direkt auf knoten 1 zu, was mit simpleXML mit $xmldoc->knoten[0] bzw. $xmldoc->knoten[0]->unterknoten1 geht?

    Der »Wert« ist wahrscheinlich ein Textknoten, der ein Kindknoten des unterknoten1-Elementknotens ist. Den kannst du entsprechend adressieren udn dessen nodeValie ändern.

    Warum sind in meinem Manual einige Funktionen fast ident:
    DOMElement->getAttribute()
    DomElement->get_attribute()
    ? Ist DOMDocument PHP5 und DomElement Vorgänger?

    Ja. Das erste ist Bestandteil von DOM, der Extension für PHP 5, das andere ist nur in DOM XML, der Extension für PHP 4 verfügbar.

    Mathias

    1. Hallo molily.

      Das glaube ich nicht. Es gibt kein getElementsById, sondern nur getElementById und das gibt niemals eine DOMNodeList zurück. Meinst du vielleicht getElementsByTagName?

      Stimmt, da habe ich mich durcheinander bringen lassen.
      (Jetzt ist die DOM-Welt in PHP auch wieder in Ordnung.)

      Einen schönen Sonntag noch.

      Gruß, Ashura

      --
      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
      mathbr:del.icio.us/ mathbr:w00t/
    2. Hellihello Mathias,

      Mit DOMDocument->DocumentElement gibts den Zugriff auf das Wurzel-Element; var_dump(wurzel) sagt mit, das sei jetzt ein DOMElement - mehr nicht (;-(;

      Äh? Was hättest du erwartet?

      Naja, "erwartet" hätte ich eine ähnliche Aufschlüsselung wie bei SimpleXML, was ja die komplette XML-Struktur als Objektschachtelung zurück gibt.

      wenn ich jetzt auf $knoten=$wurzel->getElementsById('knoten') anwende, erhalte ich ein Objekt vom Typ DOMNodeList.

      Das glaube ich nicht. Es gibt kein getElementsById, sondern nur getElementById und das gibt niemals eine DOMNodeList zurück. Meinst du vielleicht getElementsByTagName?

      Sorry, jap, id macht keinen Sinn, _TagName_.

      Dank und Gruß,

      frankx

  3. echo $begrüßung;

    Wie aber greife ich auf den Inhalte von <unterknoten1> zu und wie verändere ich diesen Wert bzw. analog wie greife ich direkt auf knoten 1 zu, was mit simpleXML mit $xmldoc->knoten[0] bzw. $xmldoc->knoten[0]->unterknoten1 geht?

    Zum Zugreifen kannst du auch die Methode http://de.php.net/manual/en/function.simplexml-element-xpath.php eines SimpleXMLElement-Objekts verwenden. Die gibt ein "richtiges" Array zurück.
    Um Werte zu verändern ist SimpleXML nicht gedacht. Unter den Userkommentaren der Handbuchseite gibt aber es einen, der eine sehr eingeschränkte Änderungsmöglichkeit aufzeigte.

    Allgemein ist zu sagen, dass SimpleXML stark vom Object Overloading Gebrauch macht. Das ist sicherlich für Ungeübte verwirrend, weil damit auf Eigenschaften zugegriffen werden kann, die real nicht existieren und die var_dump/print_r auch nicht anzeigt/anzeigen kann.

    echo "$verabschiedung $name";

    1. Hellihello

      Um Werte zu verändern ist SimpleXML nicht gedacht. Unter den Userkommentaren der Handbuchseite gibt aber es einen, der eine sehr eingeschränkte Änderungsmöglichkeit aufzeigte.

      mmh, dazu habe ich es erstmal benutzt, weil nämlich $wurzel->knoten[0]->unterknoten1="neuer Wert" genau dass ergibt wie auch if ((string)$wurzel->knoten[0]->unterknoten1=="wasauchimmer) ebenfalls prima klappt. "Simpler" geht ja nicht.

      Allgemein ist zu sagen, dass SimpleXML stark vom Object Overloading Gebrauch macht. Das ist sicherlich für Ungeübte verwirrend, weil damit auf Eigenschaften zugegriffen werden kann, die real nicht existieren und die var_dump/print_r auch nicht anzeigt/anzeigen kann.

      Mh, bring ich da grad was durcheinander? SimpleXML bringt mir doch grad die Struktuer als Objektschachtelung analog zum XML-Doc. Verwirrung entstand jetzt bei mir eher beim DOMDocument, weil das eben die Struktur so erstmal nicht auf den ersten Blick wiedergibt.
      Dank und Gruß,
      frankx

      1. echo $begrüßung;

        Allgemein ist zu sagen, dass SimpleXML stark vom Object Overloading Gebrauch macht. Das ist sicherlich für Ungeübte verwirrend, weil damit auf Eigenschaften zugegriffen werden kann, die real nicht existieren und die var_dump/print_r auch nicht anzeigt/anzeigen kann.

        Mh, bring ich da grad was durcheinander? SimpleXML bringt mir doch grad die Struktuer als Objektschachtelung analog zum XML-Doc. Verwirrung entstand jetzt bei mir eher beim DOMDocument, weil das eben die Struktur so erstmal nicht auf den ersten Blick wiedergibt.

        Vielleicht sind auch meine Erinnerungen nicht mehr ganz richtig. Meine bisher einzige Berührung mit SimpleXML hatte ich als ich einem Problem nachging, das jemand anderes damit hatte. Da fielen mir einige Ungereimtheiten auf, die man nur mit Object Overloading hinbekommt. Das Problem war wie bei dir (oder jedenfalls ähnlich), dass der Zugriff nicht wie vermutet (weil man es so von PHP gewohnt ist) funktionierte, weil es die verwendete Methode kein echtes Array zurückgab. Zu DOM... kann ich nichts weiter sagen. Für meine XML-Zwecke nutzte ich (unter PHP4) PEARs XML_Tree-Paket (nachdem ich einen inhaltsverfälschenden Fehler aus der Nicht-ASCII-Zeichen-Behandlung entfernt hatte).

        echo "$verabschiedung $name";

        1. Hellihello

            
          $xmlstr = <<<XML  
          <?xml version='1.0' standalone='yes'?>  
          <movies>  
           <movie>  
            <title>PHP: Behind the Parser</title>  
            <characters>  
             <character>  
             <name>Ms. Coder</name>  
             <actor>Onlivia Actora</actor>  
             </character>  
             <character>  
             <name>Mr. Coder</name>  
             <actor>El Act&#211;r</actor>  
             </character>  
            </characters>  
            <plot>  
             So, this language. It's like, a programming language. Or is it a  
             scripting language? All is revealed in this thrilling horror spoof  
             of a documentary.  
            </plot>  
            <rating type="thumbs">7</rating>  
            <rating type="stars">5</rating>  
           </movie>  
          </movies>  
          XML;  
          $xml = simplexml_load_string($xmlstr);  
          var_dump($xml);  
          
          

          isch ziemlich simpel... (;-). Geht auch mit simplexml_load_file.

          frankx