Nächsten Knoten auslesen

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

  • Nächsten Knoten auslesen

    Hallo,

    hab ein etwas kniffliges Problem (zumindest für mich):

    So lese ich die Inhalte der Knoten aus:
    (Hab es stark gekürzt, das funtkioniert auch soweit)

    PHP-Code:

    $xml 
    domxml_open_file('test2.xml');
    $xpc Xpath_new_context($xml);

    $ok=xpath_register_ns($xpc,'iw','http://www.url.de');


    $nodeList Xpath_eval($xpc"//iw:immobilie[$i]/iw:zustand_angaben/iw:baujahr"); // nur als ein Beispiel
    $node $nodeList->nodeset[0];
    $baujahr[] = $node->get_content(); 
    Das XML sieht im Groben so aus:

    PHP-Code:
    ...
        <
    iw:immobilie>
    <
    iw:objektkategorie>
        <
    iw:nutzungsart WOHNEN="true"/>
        <
    iw:vermarktungsart KAUF="true"/>
                       <
    iw:objektart>
                           <
    iw:haus haustyp="EINFAMILIENHAUS"/>
                       </
    iw:objektart>
    </
    iw:objektkategorie>
    ...
    <
    iw:immobilie>
    ... 
    In dem XML können mehrere Datensätze vorhanden sein, die immer mit dem immobilie-Tag umschlossen sind. Also lese ich das in einer Schleife aus.

    Mein Problem ist jetzt, daß der TAG

    <iw:haus haustyp="EINFAMILIENHAUS"/>

    auch mal

    <iw:buero_praxen buero_typ="BUEROFLAECHE"/>

    heißen kann - oder auch sonstwie.
    Wie kann ich das Abfangen?

    Ich müßte also irgendwie sagen können

    IF (der TAG, der innerhalb des objektart -TAGs liegt != iw:haus)
    $objektart="nicht Haus";

    Ich hab jetzt einiges Versucht, aus Verzeiflung sogar die Durchgänge gezählt und die entsprechenden ausgetauscht, aber das klappt immer nur bis zu einem bestimmten Punkt.
    Es muß doch irgendwie möglich sein, den Tag, der innerhalb eines anderen liegt auszulesen, ohne ihn zu kennen? Bin da echt schon zwei Tage am rätseln...

    Danke schonmal,

    Grüße,
    Coni
    Gruß, Coni
    ~~ codito ergo sum - ich code, also bin ich! ~~

  • #2
    Dü könntest DomNode->first_child() oder ->child_nodes() mit DomNode->node_type() kombinieren.

    Kommentar


    • #3
      Code:
      //iw:immobilie/iw:objektkategorie/iw:vermarktungsart/iw:objektart/*

      Kommentar


      • #4
        @onemorenerd: Werd ich mich gleich mit beschäftigen
        @phpdesaster: Äh... was willst Du mir sagen?
        Gruß, Coni
        ~~ codito ergo sum - ich code, also bin ich! ~~

        Kommentar


        • #5
          Naja, ein XPath, mit dem du auf den Knoten zugreifen kannst, oder hab ich da was vercheckt?

          Kommentar


          • #6
            Ich glaub, ich versteh Dich nicht ganz... also der Knotenname kann sich ändern. Er kann einmal

            <iw:haus haustyp="EINFAMILIENHAUS"/>

            einmal

            <iw:haus />

            einmal

            <iw:wohnung wohnungtyp="XYZ"/>

            einmal

            <iw:wohnung />

            usw.

            heißen. Und das muß ich irgendwie abfangen, also z.B., wenn der Knoten nicht HAUS (und zwar mit sämtlich möglichen folgenden Attributen) heißt, dann muß was passieren.
            Ich brauche alles, was mit <iw:haus beginnt, weiß aber nicht, was noch als Attribute folgen kann und auch nicht, was an anderen TAGs anstatt "haus" drinstehen kann.

            Hab ich jetzt dich falsch verstanden oder Du mich?
            Gruß, Coni
            ~~ codito ergo sum - ich code, also bin ich! ~~

            Kommentar


            • #7
              Grrrr, und http://de.php.net/ ist gerade down.... Alles ist gegen mich heute! ;-)
              Gruß, Coni
              ~~ codito ergo sum - ich code, also bin ich! ~~

              Kommentar


              • #8
                Mit meinem Pfad kannst du dir den Knoten holen und weiter untersuchen, beispielsweise auf den Tagnamen oder die Attribute. Alternativ kannst du auch statt dem * iw:haus verwenden. Bekommst du dann keine Ergebnisse, ist es halt kein oder ein anderer Knoten. Willst du den Knoten aber verarbeiten, musst du ersteres verwenden.

                Kommentar


                • #9
                  Puh... also ich hab jetzt mal versucht, das in meine Schleife reinzukriegen, funzt so aber nicht...

                  PHP-Code:

                  $array_element 
                  Xpath_eval($xpc"//iw:immobilie[$i]/iw:objektkategorie/iw:objektart/*");
                  //$array_element = $xml->get_elements_by_tagname("haus");
                  //print_r ($array_element);


                  if (isset($array_element[$attribzaehler]))
                  {
                        
                  $haus$array_element[$attribzaehler];
                      
                  $attList $haus-> attributes();
                      foreach (
                  $attList as $attrib) {
                      
                  $typ[$attribzaehler] = $attrib->name;
                        }
                  }
                  else
                  {
                          
                  $array_element Xpath_eval($xpc"//iw:immobilie[$i]/iw:objektkategorie/iw:objektart/*");

                          if (isset(
                  $array_element[$attribzaehler]))
                          {
                                
                  $wohnung$array_element[$attribzaehler];
                          
                  $attList $wohnung-> attributes();
                          if(
                  $attList)
                              {
                          foreach (
                  $attList as $attrib)
                                 {
                          
                  $typ[$attribzaehler] = $attrib->name;

                                 }
                              }
                            else
                            {
                            
                  $typ[$attribzaehler] = "nix";
                            }
                          }
                          else

                          
                  $typ[$attribzaehler] = "keine Angabe";

                          }

                  Muß natürlich noch irgendwie $array_element anpassen... vorher stand das drin, was im ersten Kommentar steht.
                  Aber ab einem Element, das anders heißt, funzt es nicht mehr. (die alte Version)
                  Gruß, Coni
                  ~~ codito ergo sum - ich code, also bin ich! ~~

                  Kommentar


                  • #10
                    Ich verstehe nicht ganz, was du da machst. Kenne die DOM XML Funktionen zwar jetzt nicht, ich mach einfach mal ein Beispiel mit den PHP5 DOM Funktionen.
                    PHP-Code:
                    $xpath = new XPath$theDoc );
                    $nodeList $xpath->query'//iw:immobilie['.$i.']/iw:objektkategorie/iw:objektart/*' );
                    for( 
                    $c=0$c<$nodeList->length$c++ ) {
                       
                    $tagname $nodeList->item$c )->nodeName;
                       
                    $attributes $nodeList->item$c )->attributes;
                       
                    // vielleicht auch ohne Namespace, weiß ich jetzt nicht genau!
                       
                    if( $tagname == 'iw:haus' ) {
                           
                    // Ist ein Haus!
                       
                    }
                       else {
                           
                    // Ist kein Haus!
                       
                    }

                    Das sollte ja auf deine Funktionen portierbar sein!

                    Kommentar


                    • #11
                      Okay, danke schonmal, probier ich gleich aus.

                      OffTopic:

                      Tipp: Wenn Ihr eine Katze habt, programmiert nicht im Schlafanzug.
                      Meine hat mir grad in die Eier gekrallt, verdammt, tut das weh...

                      Gruß, Coni
                      ~~ codito ergo sum - ich code, also bin ich! ~~

                      Kommentar


                      • #12
                        Okay, hab es - jetzt muß ich "nur" noch ganz vorsichtig meine ganzen anderen Funktionen unterbringen. Manchmal sollte man ein Extra Script machen, in dem es nur um das aktuelle Problem geht, da sieht man viel mehr... jetzt zumindest sieht es für mich total logisch und einfach aus.
                        (Um das ganze liegt eine for-Schleife mit $i)
                        PHP-Code:

                        $nodeList 
                        Xpath_eval($xpc"//iw:immobilie['$i']/iw:objektkategorie/iw:objektart/*"); // hier lag 
                        // im Grunde das Problem, das ich woanders gesucht hab - der * war der entscheidende Hinweis!

                        $node $nodeList->nodeset[$i];

                           
                        $tagname $node->node_name();
                           
                           echo 
                        $tagname;
                         if(
                        $tagname=="haus")
                         {
                         echo
                        " Es ist ein Haus.<br>===========";
                         }
                         elseif(
                        $tagname=="wohnung")
                         {
                         echo
                        " Es ist eine Wohnung.<br>===========";
                         }
                         else
                          {
                         echo
                        " Es ist was anderes.<br>===========";
                         } 
                        Ist natürlich eine ultra-abgespeckte Version; im fertigen Script sind dann 64 Felder zum Teil mit sehr unterschiedlichen Attributen, in denen sich pro XML-Datei hunderte Datensätze befinden können. Ich hoffe, es wird jetzt nur noch viel Schreibarbeit, sonst lande ich bald wieder hier...

                        Wenn ich da noch später die Attribute anständig reingewurschtelt kriege, dann war Dein Hinweis mit der Wildcard meine Rettung!

                        Vielen Dank!

                        Coni
                        Gruß, Coni
                        ~~ codito ergo sum - ich code, also bin ich! ~~

                        Kommentar


                        • #13
                          Ach, noch eine Frage, nur zur Sicherheit:

                          Gibt es eine Möglichkeit

                          if($a=="haus" || $a=="HaUs" || $a=="HAUS" ...)

                          eleganter zu lösen?
                          Also ich meine, daß $a Haus ist, ganz gleich welchen Case die Buchstaben haben?

                          EDIT:

                          Okay, mir ist gerade noch eingefallen, man könnte natürlich den Case vorher ändern: strtolower($a);
                          Aber gibt es was, um IF-Funktionen zu sagen, daß der Case egal ist?

                          Gruß, Coni
                          ~~ codito ergo sum - ich code, also bin ich! ~~

                          Kommentar


                          • #14
                            PHP-Code:
                            if( strtolower$a )=='haus' 
                            oder strcasecmp

                            Kommentar


                            • #15
                              strtolower siehe Edit.... was ist strcasemp? Der Link geht nicht... liegt das vielleicht daran, daß heute das Manual garnicht geht??
                              Gruß, Coni
                              ~~ codito ergo sum - ich code, also bin ich! ~~

                              Kommentar

                              Lädt...
                              X