Datensatz ändern in XML Datei

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

  • Datensatz ändern in XML Datei

    Hallo Forum,

    also, ich kämpfe jetzt seit einiger Zeit damit rum ein XML-File zu lesen, dann im angelegten Array einen Datensatz zu finden, den abzuändern und dann wieder das "geänderte" XML-File zu schreiben.
    Nun, eigentlich funzt das alles bis auf das Schreiben der Datei. Der geänderte Wert steht einfach nicht drin (das File ansich wird korrekt geschrieben ... aber einfach mit den "herausglesenen" Werten).
    Ich weiss mir nicht mehr zu helfen ... könnt ihr euch den code mal anschauen und herausfinden wo hier der Fehler liegt?

    Code:

    PHP-Code:
    <?php
    require "xmlfile.php";
    //include "xmlfile.php";
    $xml = new XMLFile();

    //XML-File lesen
    $fh fopen("MeinFile.xml","r");
    $xml->read_file_handle($fh);
    fclose($fh);

    //get root
    $root = &$xml->roottag;

    //get seperator tag name
    $sep $root->tags[0]->name;

    //define colors
    $attr_col "#FF0000";
    $data_col "#0000FF";

    get_tags($root,0);

    //Formular "Suchen"
    print ("<form action='$php_self' method='POST'>");
    print (
    "<table bgcolor='#FFC000' border=1 cellspacing='2' cellpadding='2'>");
    print (
    "<tr>");
    print (
    "<td>Tag /Attribut:</td>");
    print (
    "<td>");
    print (
    "<select name='kat'>");
    foreach (
    $key_puf as $key) {
        print 
    "<option value='$key'>$key";
    }
    print (
    "</select>");
    print (
    "</td>");
    print (
    "<td>Wert:</td>");
    print (
    "<td>");
    print (
    "<input type='Text' name='find' value='' size='40'>");
    print (
    "</td>");
    print (
    "<td></td>");
    print (
    "<td>");
    print (
    "<input type='Submit' name='OK' value='Datensatz suchen'>");
    print (
    "</td></tr>");
    print (
    "</form>");
    print (
    "</table><p>");

    //baut das gesamte XML-File auf, um es mit check() zu durchsuchen.
    get_tags($root,1);

    //subtags_über Eingabe finden:
    //    Eingabe (=$find), Schlüsselfeld im Datenbestand (=$key),
    //    festgelegte Suchkategorie (=$kat)
    check();


    $fh fopen("MeinFile.xml","w");
    $xml->write_file_handle($fh);
    fclose($fh);


    // Funktionen ...

    function get_tags($rt$ck) {
        
    $tag_arr=$rt->tags;
        
    $i=0;
        while (
    $this_tag $tag_arr[$i]) {
            
    puf_tag($this_tag$ck);
            
    get_tags($this_tag$ck);
            
    $i++;
        }
        return 
    $this_tag;
    }

    function 
    puf_tag($tg) {
        global 
    $data_puf$key_puf$sep$attr_col$data_col;
        
    $tagname $tg->name;
        
    $tagdata $tg->cdata;
        
    $tagattr $tg->attributes;
        if(
    $tagname == $sep) {
            if (
    $ck) {
                
    check();
            }
            
    $data_puf=array();
            
    $key_puf=array();
        }
        foreach(
    $tagattr as $key => $elem) {
            
    array_push($key_puf,$key);
            
    array_push($data_puf,$elem);
        }
        
    array_push($key_puf,$tagname);
        
    array_push($data_puf,$tagdata);
    }

    // Vergleicht für jede Variable im XML-File den Variablennamen (=$key),
    // vergleicht sie mit der gesuchten Kategorie (=$kat) und vergleicht
    // bei Treffer den Suchbegriff (=$find) mit den im Datensatz enthaltenen
    // Daten (=$data_puf[$i]).
    // Die Funktion eregi($find, $data-puf[$i]) dient hierbei dazu, zu suchen
    // ob der Suchstring (=$find) im Datenfeld (=$data-puf[$i]) enthalten ist.
    function check() {
        global 
    $kat$find$data_puf$key_puf$zeiger$attr_col$data_col;
        
    $i=0;
        foreach(
    $key_puf as $key) {
    //        if ($key == strtoupper($kat)) {
            
    if ($key == $kat) {
                if (
    eregi ($find$data_puf[$i])) {
                    
    $zeiger $i-2;
                    
    show($zeiger);
                    
    change($zeiger);
                    
    show($zeiger);
                }
            }
        
    $i++;
        }
    }

    // Zeigt den kompletten Datensatz für die gefundene Variable
    // im XML-File den Variablennamen (=$key) und die dazu gehörigen
    // Daten (=$data_puf[$i]).
    function change($zeiger) {
        global 
    $key_puf$data_puf$data_col;
        global 
    $nam$showIt$ref;
        
        
    $nam "jetzt ist es geändert";
        
    $showIt "jetzt false";
        
    $ref "122";
        
    $i=$zeiger;
        foreach(
    $key_puf as $key) {
            if (
    $i == $zeiger) {
                
    $data_puf[$i] = $nam;
                print 
    $key;
                print 
    ": ";
                print 
    "<font color=$data_col>$data_puf[$i]</font>";
                print 
    "<br>";        }
            if (
    $i == $zeiger+1) {
                
    $data_puf[$i]=$showIt;
                print 
    $key;
                print 
    ": ";
                print 
    "<font color=$data_col>$data_puf[$i]</font>";
                print 
    "<br>";
            }
            if (
    $i == $zeiger+2) {
                print 
    $key;
                print 
    ": ";
                print 
    "<font color=$data_col>$data_puf[$i]</font>";
                print 
    "<br>";
            }
           
    $i++;
        }
        print 
    "<br>";
    }
    function 
    show($zeiger) {
        global 
    $key_puf$data_puf$data_col;
        
    $i=$zeiger;
        foreach(
    $key_puf as $key) {
            if (
    $i == $zeiger) {
                print 
    $key;
                print 
    ": ";
                print 
    "<font color=$data_col>$data_puf[$i]</font>";
                print 
    "<br>";
            }
            if (
    $i == $zeiger+1) {
                print 
    $key;
                print 
    ": ";
                print 
    "<font color=$data_col>$data_puf[$i]</font>";
                print 
    "<br>";
            }
            if (
    $i == $zeiger+2) {
                print 
    $key;
                print 
    ": ";
                print 
    "<font color=$data_col>$data_puf[$i]</font>";
                print 
    "<br>";
            }
            
    $i++;
        }
        print 
    "<br>";
    }
    ?>

    Die Funktion change() soll ändern (die print Befehle sind für mich zur Überwachung da), show() soll zeigen wie der Wert vorher war und wie er nachher ist. 
    Das stimmt alles und der Wert wird im Browser auch „geändert“ angezeigt.
    Das ganze ist ein manueller Test, da letzlich das genze aus Flash mit Variablenübergabe stattfinden soll.

    Ein zusätzliches Problem:
    suchen kann ich nur im letzten von (im Moment) 12 „Haupt“-datensätzen (jeder davon enthält wieder 3 Unterdatensätze.

    Hier noch die Hilfsfunktionen read_file_handle( $fh ) und write_file_handle( $fh ): 

        function read_file_handle( $fh )
        {
            $this->init();
            $this->parser = xml_parser_create("iso-8859-1");
            xml_set_object( $this->parser, $this );
            xml_parser_set_option ( $this->parser, XML_OPTION_CASE_FOLDING, FALSE);
            xml_set_element_handler( $this->parser, "_tag_open", "_tag_close" );
            xml_set_character_data_handler( $this->parser, "_cdata" );

            while( $data = fread( $fh, 4096 )) {
                if (!xml_parse( $this->parser, $data, feof( $fh ) )) {
                    die(sprintf("XML fucking error: %s at line %d",
                        xml_error_string(xml_get_error_code($this->parser)),
                        xml_get_current_line_number($this->parser)));
                }
            }

            xml_parser_free( $this->parser );
        }

        function write_file_handle( $fh, $prepend_str='' )
        {
            # Get the attribute string
            $data_col = "#0000FF";
            $attrs = array();
            $attr_str = '';
            foreach( $this->attributes as $key => $val )
            {
    //            $attrs[] = strtoupper($key) . "=\"$val\"";
                $attrs[] = $key . "=\"$val\"";
                print "attrs[]: ";
                print "<font color=$data_col>$val</font>";
                print "<br>";
            }
            if ($attrs) {
                $attr_str = join( " ", $attrs );
            }
            # Write out the start element
            $tagstr = "$prepend_str<{$this->name}";
            if ($attr_str) {
                $tagstr .= " $attr_str";
            }

            $keys = array_keys( $this->tags );
            $numtags = sizeof( $keys );
            # If there are subtags and no data (only whitespace), 
            # then go ahead and add a carriage
            # return.  Otherwise the tag should be of this form:
            # <tag>val</tag>
            # If there are no subtags and no data, then the tag should be
            # closed: <tag attrib="val"/>
            $trimmeddata = trim( $this->cdata );
            if ($numtags && ($trimmeddata == "")) {
                $tagstr .= ">\n";
            }
            elseif (!$numtags && ($trimmeddata == "")) {
                $tagstr .= " />\n";
            }
            else {
                $tagstr .= ">";
            }

            fwrite( $fh, $tagstr );

            # Write out the data if it is not purely whitespace
            if ($trimmeddata != "") {
                fwrite( $fh, $trimmeddata );
            }

            # Write out each subtag
            foreach( $keys as $k ) {
                $this->tags[$k]->write_file_handle( $fh, "$prepend_str\t" );
            }

            # Write out the end element if necessary
            if ($numtags || ($trimmeddata != "")) {
                $tagstr = "</{$this->name}>\n";
                if ($numtags) {
                    $tagstr = "$prepend_str$tagstr";
                }
                fwrite( $fh, $tagstr );
            }
        }

    }
    diese sind von „XMLfile.php“ von Chris Monson übernommen und ein wenig von mir modifiziert (eigentlich hier nur xml_parser_set_option ( $this->parser, XML_OPTION_CASE_FOLDING, FALSE); geändert.

    … vielleicht steckt ja auch hier der Fehler drin … ich blick es im Moment überhaupt nicht mehr und verzweifle fast. Hänge nun schon eine Woche dran

    bin für schnelle Hilfe saudankbar!!!!!!

    Gruß
    Bernd


    EDIT:
    php.tags powered by Abraxax


    EDIT:
    INFO: auch jeder user, darf die php.tags selber setzen.
    Zuletzt geändert von Abraxax; 22.07.2003, 12:10.

  • #2
    Hi rübenkopf!

    Willkommen in der Community!

    Nimm es mir nicht übel, aber ich habe kein Bock auf die Tapette.
    Zumal Du übliche Techniken nicht kennst oder bewust meidest.

    Ich reich Dich mal weiter ...

    cu

    Blaster
    Yuppi, endlich Elite ...

    Kommentar


    • #3
      sorry

      hi blaster,

      tut mir leid mit dem wandbehang ... wollte echt nur alles posten, um ein sonst übliches 20-fragen-antworten-spiel zu vermeiden.

      habe soeben die lösung gefunden
      war eine sache des setzens der richtigen variablen. das array wird aufgebaut, umgesetzt und das objekt natürlich nicht berührt.

      nur noch ne frage, blaster ... was meinste mit "richtigen techniken nicht kennst oder bewusst meidest"?
      habe ich so viel mist gebaut in dem skript??? (bin doch erst seit ner woche an PHP!! ) oder ist es die art des postings? (hoff)

      viele grüße
      bernd

      Kommentar


      • #4
        Re: sorry

        Original geschrieben von rübenkopf
        nur noch ne frage, blaster ... was meinste mit "richtigen techniken nicht kennst oder bewusst meidest"?
        habe ich so viel mist gebaut in dem skript??? (bin doch erst seit ner woche an PHP!! ) oder ist es die art des postings? (hoff)
        Na gut! Für eine Woche PHP ist das schon ganz ordentlich, sofern überwiedend selbst gecodet.
        Yuppi, endlich Elite ...

        Kommentar


        • #5
          überwiegend selbst, ja

          grobe fehler drin? muss ich meine technik umstellen?

          letztendlich kommt eh das meiste wieder raus ... war ein testformular. die variablen werden dann aus flash übergeben.

          was bleibt ist nur die schleife, die den datensatz sucht und ändert, die ganzen print- Befehle und der html code verschwindet. das war nur zum testen ob es auch funzt.

          hast du mir ein tip was sonst noch falsch ist? werde eh noch mehr mit php machen müssen. nicht, dass ich "grundlegende" programmiertechniken flasch mache.

          gruß bernd

          Kommentar

          Lädt...
          X