XML OO parsen

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

  • XML OO parsen

    Hallo,

    ich bin gerade dabei mit xml parsing rum zuexperimentieren und habe natürlich Probleme damit... Es scheint so, als geht er den "PATH" zweimal durch. Ich habe das mit ner 1 im Output gekennzeichnet. Weiß von Euch jmd worans liegen kann?

    phh code:

    PHP-Code:
    class RSSParser {

       var 
    $inside_bereich false;
       var 
    $name"";
       var 
    $inside_anwendung false;
       var 
    $tag "";
       var 
    $title "";
       var 
    $path "";

       function 
    startElement($parser$tagName$attrs) {
           if (
    $this->inside_bereich) {
               
    $this->tag $tagName;
           } elseif (
    $tagName == "BEREICH") {
               
    $this->inside_bereich true;
           }

           if (
    $this->inside_anwendung) {
               
    $this->tag $tagName;
           } elseif (
    $tagName == "ANWENDUNG") {
               
    $this->inside_anwendung true;
           }
       }

       function 
    endElement($parser$tagName) {
           if (
    $tagName == "ANWENDUNG") {
               
    $this->inside_anwendung false;
           }

           if (
    $tagName == "BEREICH") {
               
    $this->inside_bereich false;
           }


       }

       function 
    characterData($parser$data) {
           if (
    $this->inside_bereich) {

               if (
    $this->tag == "NAME") {
                    
    $this->name .= $data;
                    
    printf("<p><b>%s</b></p>",
                    
    trim($this->name));
                    
    $this->name "";
                    }
           }

           if (
    $this->inside_anwendung) {
               switch (
    $this->tag) {
                   case 
    "TITLE":
                   
    $this->title .= $data;
                   break;
                   case 
    "PATH":
                   
    $this->path .= $data;
                   
    printf("<a href='%s'>%s1</a><br>",
                   
    trim($this->path),htmlspecialchars(trim($this->title)));
                   
    $this->title "";
                   
    $this->path "";
                   break;
               }
           }
       }
    }

    $xml_parser xml_parser_create();
    $rss_parser = new RSSParser();
    xml_set_object($xml_parser,&$rss_parser);
    xml_set_element_handler($xml_parser"startElement""endElement");
    xml_set_character_data_handler($xml_parser"characterData");
    $fp fopen("data/menu.xml","r")
       or die(
    "Error reading XML data.");
    while (
    $data fread($fp4096))
       
    xml_parse($xml_parser$datafeof($fp))
           or die(
    sprintf("XML error: %s at line %d",
               
    xml_error_string(xml_get_error_code($xml_parser)),
               
    xml_get_current_line_number($xml_parser)));
    fclose($fp);

    xml_parser_free($xml_parser); 
    XML File:

    Code:
    <menu>
    <dienst>
    <bereich>
    <name>Mail</name>
    
    <anwendung>
    <title>Quarantaene</title>
    <path>/var/www/quarantine</path>
    <auswahl>
    <standort>
    Bremen
    </standort>
    <standort>
    Hamburg
    </standort>
    <standort>
    Luebeck
    </standort>
    </auswahl>
    </anwendung>
    
    <anwendung>
    <title>Viren</title>
    <path>/var/www/viren</path>
    </anwendung>
    
    <anwendung>
    <title>Mailconf</title>
    <path>/var/www/mailconf/</path>
    <auswahl>
    <standort>
    Bremen
    </standort>
    <standort>
    Hamburg
    </standort>
    <standort>
    Luebeck
    </standort>
    </auswahl>
    </anwendung>
    </bereich>
    
    <bereich>
    <name>Proxy</name>
    <anwendung>
    <title>Konfiguration</title>
    <path>/var/www/proxyconf/</path>
    <auswahl>
    <standort>
    Bremen
    </standort>
    <standort>
    Hamburg
    </standort>
    <standort>
    Luebeck
    </standort>
    </auswahl>
    </anwendung>
    
    <anwendung>
    <title>Logdateien</title>
    <path>/var/www/proxylogs/</path>
    <auswahl>
    <standort>
    Bremen
    </standort>
    <standort>
    Hamburg
    </standort>
    <standort>
    Luebeck
    </standort>
    </auswahl>
    </anwendung>
    </bereich>
    </dienst>
    
    </menu>
    HTML Output:

    Mail



    Quarantaene1
    1
    Viren1
    1
    Mailconf1
    1

    Proxy


    Konfiguration1
    1
    Logdateien1
    1

    EDIT:
    code+quote.tags by Abraxax
    Zuletzt geändert von Abraxax; 06.10.2003, 09:41.

  • #2
    *VERSCHIEB* nach php+xml
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      das warum kann ich dir auch nicht sagen, ich habe mir geholfen, indem ich noch eine if !empty abfrage davorgeschaltet habe. danach rannte es ... hoffe es hilft dir

      bis denne

      megle

      <code>
      function characterData( $r_parser , $c_name ) {
      $c_leer = trim( $c_name );
      if( !empty( $c_leer ) ) {
      dein codeBlock;
      }
      }

      </code>

      Kommentar


      • #4
        Das hat leider nicht geholfen
        Vielleicht hilft dieser Output?

        HTML Output:

        in BereichNAME
        Mail2

        NAME
        2

        in AnwendungTAG=TITLETAG=TITLETAG=PATHQuarantaene1TAG=PATH1AnwendungENDE
        in AnwendungTAG=TITLETAG=TITLETAG=PATHViren1TAG=PATH1AnwendungENDE
        in AnwendungTAG=TITLETAG=TITLETAG=PATHMailconf1TAG=PATH1AnwendungENDE
        BereichENDEin BereichNAME

        PHP:
        PHP-Code:
        class RSSParser {

           var 
        $inside_bereich false;
           var 
        $name"";
           var 
        $inside_anwendung false;
           var 
        $tag "";
           var 
        $title "";
           var 
        $path "";

           function 
        startElement($parser$tagName$attrs) {
               if (
        $this->inside_bereich) {
                   
        $this->tag $tagName;
               } elseif (
        $tagName == "BEREICH") {
                   
        $this->inside_bereich true;
                   print(
        "in Bereich");
               }

               if (
        $this->inside_anwendung) {
                   
        $this->tag $tagName;
               } elseif (
        $tagName == "ANWENDUNG") {
                   
        $this->inside_anwendung true;
                    print(
        "in Anwendung");
               }
           }

           function 
        endElement($parser$tagName) {
               if (
        $tagName == "ANWENDUNG") {
                   
        $this->inside_anwendung false;
                   print(
        "AnwendungENDE<br>");
               }

               if (
        $tagName == "BEREICH") {
                   
        $this->inside_bereich false;
                   print(
        "BereichENDE");

               }


           }

           function 
        characterData($parser$data) {
               if (
        $this->inside_bereich) {
                   if (
        $this->tag == "NAME") {
                        
        $this->name .= $data;
                        print(
        "NAME");
                        if( !empty( 
        $this->name ) ) {
                            
        printf("<p><b>%s2</b></p>",
                            
        trim($this->name));
                            
        $this->name "";
                            }
                        }
               }

               if (
        $this->inside_anwendung) {
                   switch (
        $this->tag) {
                       case 
        "TITLE":
                       
        $this->title .= $data;
                       print(
        "TAG=TITLE");

                       break;
                       case 
        "PATH":
                       print(
        "TAG=PATH");
                       
        $this->path .= $data;
                       if( 
        $this->path != "" ) {
                           
        printf("<a href='%s'>%s1</a>",
                           
        trim($this->path),htmlspecialchars(trim($this->title)));
                           
        $this->title "";
                           
        $this->path "";
                           break;
                           }
                   }
               }
           }
        }

        $xml_parser xml_parser_create();
        $rss_parser = new RSSParser();
        xml_set_object($xml_parser,&$rss_parser);
        xml_set_element_handler($xml_parser"startElement""endElement");
        xml_set_character_data_handler($xml_parser"characterData");
        $fp fopen("data/menu.xml","r")
           or die(
        "Error reading XML data.");
        while (
        $data fread($fp4096))
           
        xml_parse($xml_parser$datafeof($fp))
               or die(
        sprintf("XML error: %s at line %d",
                   
        xml_error_string(xml_get_error_code($xml_parser)),
                   
        xml_get_current_line_number($xml_parser)));
        fclose($fp);

        xml_parser_free($xml_parser); 

        Kommentar


        • #5
          sorry, hab leider immer nur wenig zeit, und kann von daher leider auch immer nur einen kleinen blick auf dein script werfen. du hast vor der !empty abfrage kein trim, das kommt erst später. irgendwie kommen aber whitespaces mit (\0,\n usw) und die mußt du vorher rausbringen, sonst rennt es nicht ...

          Kommentar

          Lädt...
          X