jimbob: domXML unterknoten auslesen? hää

hallo,

ich hab eine xml datei:
...
 <ELEMENT type="select" name="look">
        <CHOICE>Sexy</CHOICE>
        <CHOICE>luky</CHOICE>
        <CHOICE>schmacky</CHOICE>
        <CHOICE>kacky</CHOICE>
    </ELEMENT>
...
nun will ich die unterknoten von element also CHOICE auslesen!
was jedcoh herauskommt ist ein array welches folgendermassen aussieht!

Array ( [0] => [1] => Sexy [2] => [3] => luky [4] => [5] => schmacky [6] => [7] => kacky [8] => )

warum hab ich mehr knoten als ich hab?

THX jimbob

  1. Hallo,

    warum hab ich mehr knoten als ich hab?

    Die Zeilenumbrueche werden als Textknoten behandelt. Abhilfe schafft die Verwendung der Methode normalize(), siehe http://www.php.net/manual/en/function.dom-domdocument-normalize.php.

    MfG, Thomas

    1. Die Zeilenumbrueche werden als Textknoten behandelt. Abhilfe schafft die Verwendung der Methode normalize

      danke vielmals! ich werde normalize mal drübe rlaufen lassen!

      mfg jimbob

    2. wie wende ich diese function an?
      ist ja nichts dokumentiert!

      $XML = domxml_open_file($XML_file);

      und nun?

      $XML->normalize();
      macht einen fehler!

      $XML= XML->normalize(??);

      THX jimbob

      1. Hi,

        wie wende ich diese function an?
        ist ja nichts dokumentiert!

        es ist _alles_ dokumentiert.

        $XML = domxml_open_file($XML_file);

        domxml_open_file ist eine Funktion in DOM_XML, normalize in DOM: http://de2.php.net/manual/en/ref.dom.php. Beachte dort insbesondere den ersten Satz.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. hey schalubi lese da mal die posts vorher durch!

          normalize() ist nicht documentiert!

          aber bitte wie wende ich es an?

          http://www.php.net/manual/en/function.dom-domdocument-normalize.php.

          1. Hi,

            hey schalubi lese da mal die posts vorher durch!

            ich hoffe, es geht Dir gut.

            normalize() ist nicht documentiert!

            Selbstverständlich ist es das. Thomas hat sogar einen Direktlink gepostet - und dort steht alles, was man braucht.

            aber bitte wie wende ich es an?
            http://www.php.net/manual/en/function.dom-domdocument-normalize.php.

            Abgesehen davon, dass Du bitte </faq/#Q-19> beachtest: Soll Dir noch jemand vorlesen, was auf o.g. Seite steht? Der Informationsgehalt ist nun wirklich übersichtlich genug, Du musst nur beachten, was da steht. Und eventuell mein vorheriges Posting noch mal lesen, das Du offenbar auch nicht verstanden hast.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. was ist nun das problem?
              kann mann nicht einfach sagen wie sie angewendet wird, des dauert eine halbe zeile, da mus sich nix einbinden usw.
              ich hab alles gelesen abe res macht nicht klick, sorry!
              also warum kann man nciht einfach auf diese sehr sehr leichte frage antworten, wenn man sich in der thematik eh voll auskennt?

              sorry, es muss auch dumme menschen geben und anscheinend gehör ich voll dazu!

              jimbob

              PS: wie bitte wendet man:
              void DOMDocument->normalize ( void )
              an?

              1. Hi,

                PS: wie bitte wendet man:
                void DOMDocument->normalize ( void )
                an?

                die Aussage dieser Zeile ist: Die Methode normalize(), welche kein Argument erwartet (void), kann auf jedes Objekt des Typs DOMDocument angewendet werden, und liefert keine Rückgabe (erstes void). Vergleiche dies nun mit der Dokumentation von domxml_open_file(). Tipp: Beachte die Navigation auf der linken Seite.

                Cheatah

                --
                X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
                1. und genau da bekomme ich einen fehler und das war der grund der eigentlichen frage!

                  $this->XML = domxml_open_file($XML_file);
                  $this->XML->normalize();

                  git den fehler:
                  Fatal error: Call to undefined function: normalize()
                  also scheiont es so als ob sie nicht bei DOMXML dabei ist, oder was?

                  1. Hi,

                    also scheiont es so als ob sie nicht bei DOMXML dabei ist, oder was?

                    Bingo! Jetzt musst Du entweder sehen, bei Deinem Objekttyp eine entsprechende Methode zu finden, oder das Objekt im gewünschten Typ zu erstellen.

                    Cheatah

                    --
                    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                    X-Will-Answer-Email: No
                    X-Please-Search-Archive-First: Absolutely Yes
                    1. danke,

                      aber nachdem ich bereits mit domxml seit einer woche arbeite, müsste ja die methode normalize() auch dabei sein, oder?
                      also was ist nun los?

                      1. Hi,

                        aber nachdem ich bereits mit domxml seit einer woche arbeite, müsste ja die methode normalize() auch dabei sein, oder?

                        Du meinst, die PHP-Entwickler haben gemerkt, dass Du es intensiv nutzt, und deswegen eine neue Methode reinprogrammiert? ;-) Bedaure, nein. Wenn Du Dein Problem mit diesem Objekttyp lösen möchtest, musst Du anders vorgehen.

                        Cheatah

                        --
                        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                        X-Will-Answer-Email: No
                        X-Please-Search-Archive-First: Absolutely Yes
                        1. neee,
                          der server supported nur DOMXML!
                          und ich benutz es seit einer woche, also warum ist normalize() eine undefined function (also nicht vorhanden)?

                          1. Hi,

                            der server supported nur DOMXML!

                            dann kannst Du normalize() nicht verwenden, sondern musst einen Weg mit den DOM_XML-Methoden finden.

                            und ich benutz es seit einer woche, also warum ist normalize() eine undefined function (also nicht vorhanden)?

                            Ich dachte, das "warum" sei mittlerweile klar. Das Math-Objekt hat keine open()-Methode zum Fensteröffnen.

                            Cheatah

                            --
                            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                            X-Will-Answer-Email: No
                            X-Please-Search-Archive-First: Absolutely Yes
            2. was ist nun das problem?
              kann mann nicht einfach sagen wie sie angewendet wird, des dauert eine halbe zeile, da mus sich nix einbinden usw.
              ich hab alles gelesen abe res macht nicht klick, sorry!
              also warum kann man nciht einfach auf diese sehr sehr leichte frage antworten, wenn man sich in der thematik eh voll auskennt?

              sorry, es muss auch dumme menschen geben und anscheinend gehör ich voll dazu!

              jimbob

              also wie wendet man:
              void DOMDocument->normalize ( void )
              bitte an!

        2. was ist nun das problem?
          kann mann nicht einfach sagen wie sie angewendet wird, des dauert eine halbe zeile, da mus sich nix einbinden usw.
          ich hab alles gelesen abe res macht nicht klick, sorry!
          also warum kann man nciht einfach auf diese sehr sehr leichte frage antworten, wenn man sich in der thematik eh voll auskennt?

          sorry, es muss auch dumme menschen geben und anscheinend gehör ich voll dazu!

          jimbob

          1. Hi,

            was ist nun das problem?

            Du wendest eine Methode des Objekttyps DOM auf ein Objekt des Typs DOM_XML an. Das ist so, als würdest Du in JavaScript "Math.open()" sagen und erwarten, dass sich ein Fenster öffnet.

            kann mann nicht einfach sagen wie sie angewendet wird, des dauert eine halbe zeile,

            Vielleicht tut es das, aber dann wirst Du Objektorientierung nie verstehen und auch nicht lernen, Probleme zu lösen. Da genau dies mein Anliegen ist, kann ich Dir also keine Lösung nennen.

            also warum kann man nciht einfach auf diese sehr sehr leichte frage antworten, wenn man sich in der thematik eh voll auskennt?

            Tu ich nicht, ich habe diese Dinge in PHP noch nie angewendet. Ich beherrsche jedoch die immens wichtige Technik des Dokumentationslesens, welche zu erlernen mein Ziel für Dich ist.

            sorry, es muss auch dumme menschen geben und anscheinend gehör ich voll dazu!

            Das glaube ich nicht. Und wenn dem doch so ist, dann ändere ich das soeben.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo,

    Wie gesagt, die Zeilenumbrüche, Leerzeichen und Tabulatoren zwischen den Tags der CHOICE-Elemente erzeugen eigene Textknoten. Da du anscheinend irgendwie die Kindknoten durchläufst, also die Rückgabe von $element->child_nodes(), könntest du dabei prüfen, ob es sich jeweils um ein Elementknoten handelt ($knoten->node_type() muss XML_ELEMENT_NODE zurückgeben) und nur den Textinhalt in den Array übernehmen. Wenn es dir um die CHOICE-Elemente geht, liefert $element->get_elements_by_tagname('CHOICE') alle solchen im ELEMENT-Element ($element steht für dessen Elementknoten). So kommen dir die leeren Textknoten nicht in die Quere.

    Mathias

    1. Eine weitere Möglichkeit ist, eine DTD anzugeben und domxml_open_mem bzw. domxml_open_file mit dem Modus DOMXML_LOAD_DONT_KEEP_BLANKS aufzurufen. In der DTD müsste dann stehen, dass kein Text direkt im ELEMENT-Element auftauchen darf. Ein vereinfachtes Beispiel:

      <?php

      $xml = '<!DOCTYPE ELEMENT [
       <!ELEMENT ELEMENT (CHOICE)+>
       <!ELEMENT CHOICE (#PCDATA)>
      ]>
      <ELEMENT type="select" name="look">
         <CHOICE>Sexy</CHOICE>
         <CHOICE>luky</CHOICE>
         <CHOICE>schmacky</CHOICE>
         <CHOICE>kacky</CHOICE>
      </ELEMENT>';

      $domdoc = domxml_open_mem($xml, DOMXML_LOAD_DONT_KEEP_BLANKS, $errors);
      if ($domdoc and !$errors) {
       $root = $domdoc->document_element();
       $children = $root->child_nodes();
       var_dump($children);
      }
      ?>

      Die leeren Textknoten sollten nun nicht im Baum auftauchen, weil diese Lesart der DTD widerspräche.
      Diese Vorgehensweise erfordert mindestens die PHP-Version 4.3.0.

      Mathias