Guten Tag,
ich will eine XML-Datei mit dem Expat-Parser in PHP einlesen (was auch funktioniert),
dann mit Hilfe von Switch-Case die einzelnene Elemente ansteuern (was funktioniert),
und diese dann in einer neuen Datei abspeichern (was nicht funktioniert).
Hintergrund ist, dass ich dadurch die einzelenen Werte der Elemente und die Elemente selbst ausgeben bzw. verändern kann.
Also bspw. wird das Element <OS>Windows</OS> mit Switch Case angesteuert und ich kann es dann ausgeben bzw. in der switch-case Funktion angeben was genau ich tun möchte. In dieser Anweisung würd ich gern in eine neue XML-Datei (new_xml.xml) etwas schreiben, für den Anfang einfach das Element OS.
Am Ende würde ich dann das gesamte XML-Dokument mit Ausgestaltung der Switch-Case Anweisung wieder erhalten und könnte, bspw., Die Elementnamen, Elementwerte, Elementattribute alle in einem Rutsch verändern, ersetzen etc.
Das Problem ist,
Versuche ich in der Anweisung new_xml.xml zu öffnen, geht das nur immer wieder von neuen mit
$newFile = fopen("new_xml.xml", "w") or die("Unable to open file") ;
Versuche ich das File außerhalb von switch-case zu öffnen und innerhalb von switch-case zu schreiben mit fwrite, gibts den Fehler undefined variable.
Durch das erneute öffnen von der XML wird aber die Datei immer wieder überschrieben. Es müsste also am Anfang vom parsen geöffnet und am ende vom parsen geschlossen werden.
Falls jemand weiß wie ich dieses Problem beheben kann, bitte helfen.
Oder falls es bessere Lösungen gibt, bitte mir ganz dolle an den Kopf knallen.
mfg
ich will eine XML-Datei mit dem Expat-Parser in PHP einlesen (was auch funktioniert),
dann mit Hilfe von Switch-Case die einzelnene Elemente ansteuern (was funktioniert),
und diese dann in einer neuen Datei abspeichern (was nicht funktioniert).
Hintergrund ist, dass ich dadurch die einzelenen Werte der Elemente und die Elemente selbst ausgeben bzw. verändern kann.
Also bspw. wird das Element <OS>Windows</OS> mit Switch Case angesteuert und ich kann es dann ausgeben bzw. in der switch-case Funktion angeben was genau ich tun möchte. In dieser Anweisung würd ich gern in eine neue XML-Datei (new_xml.xml) etwas schreiben, für den Anfang einfach das Element OS.
Am Ende würde ich dann das gesamte XML-Dokument mit Ausgestaltung der Switch-Case Anweisung wieder erhalten und könnte, bspw., Die Elementnamen, Elementwerte, Elementattribute alle in einem Rutsch verändern, ersetzen etc.
Das Problem ist,
Versuche ich in der Anweisung new_xml.xml zu öffnen, geht das nur immer wieder von neuen mit
$newFile = fopen("new_xml.xml", "w") or die("Unable to open file") ;
Versuche ich das File außerhalb von switch-case zu öffnen und innerhalb von switch-case zu schreiben mit fwrite, gibts den Fehler undefined variable.
Durch das erneute öffnen von der XML wird aber die Datei immer wieder überschrieben. Es müsste also am Anfang vom parsen geöffnet und am ende vom parsen geschlossen werden.
Falls jemand weiß wie ich dieses Problem beheben kann, bitte helfen.
Oder falls es bessere Lösungen gibt, bitte mir ganz dolle an den Kopf knallen.
mfg
PHP:
<?php
// Initialize the XML parser
$parser=xml_parser_create();
// Function to use at the start of an element
function start($parser,$element_name,$element_attrs) {
switch($element_name) {
case "OS":
echo $element_name;
/*
Hier würde ich in das File schreiben wollen würden mit
$newFile = fopen("new_xml.xml", "w") or die("Unable to open file");
fwrite($newFile, $element_name);
nur ohne
$newFile = fopen("new_xml.xml", "w") or die("Unable to open file");
da es sonst immer überschrieben wird!!
*/
}
}
// Function to use at the end of an element
function stop($parser,$element_name) {
echo "<br>";
}
// Function to use when finding character data
function char($parser,$data) {
echo $data;
}
// Specify element handler
xml_set_element_handler($parser,"start","stop");
// Specify data handler
xml_set_character_data_handler($parser,"char");
// Open XML file
$fp=fopen("computers.xml","r");
// Read data
echo "<h1>Nummer 1</h1>";
while ($data=fread($fp,4096)) {
xml_parse($parser,$data,feof($fp)) or
die (sprintf("XML Error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
// Free the XML parser
xml_parser_free($parser);
echo "</table>";
?>
XML:
<?xml version="1.0" encoding="utf-8"?>
<Hardware>
<System category="office" ID="1">
<OS lang="en" typ="no">Windows 10</OS>
<CPU>Intel Core i7 11700k</CPU>
<GPU>Intel UHD-Grafik 750</GPU>
<RAM>Corsair 32GB DDR4 3200MHz</RAM>
<SSD>Samsung 870 QVO 1TB</SSD>
<MB>MSI B450</MB>
<PSU> be quite! 500W</PSU>
<Case>be quite! Pure Base 500</Case>
<Extras>
<Extra> Extra 1 </Extra>
<Extra> Extra 2 </Extra>
<Extra> Extra 3 </Extra>
</Extras>
</System>
<System category="normal" ID="1">
<OS lang="en">Windows 10</OS>
<CPU>Intel Core i5 11600k</CPU>
<GPU>Intel UHD-Grafik 750</GPU>
<RAM>Corsair 16GB DDR4 3200MHz</RAM>
<SSD>Samsung 870 QVO 500GB</SSD>
<MB>MSI B450</MB>
<PSU> be quite! 400W</PSU>
<Case>Sharkoon VS4-V</Case>
</System>
<System category="gaming" ID="1">
<OS lang="en">Windows 10</OS>
<CPU>Intel Core i9 12900k</CPU>
<GPU>GeForce RTX 3090</GPU>
<RAM>Corsair 64GB DDR4 3600MHz</RAM>
<SSD>Samsung 980 Pro 2GB</SSD>
<MB>ASRock Z690</MB>
<PSU> be quite! 850W</PSU>
<Case>be quite! Dark Base Pro 900</Case>
</System>
</Hardware>