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:
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
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 );
}
}
}
… 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.
Kommentar