Ich habe 2 XML-Dateien Datei1:
<xml_file>
<var1>Value 1</var1>
<var2>Value 2</var2>
<var3>Value 3</var3>
</xml_file>
Datei2:
<xml_file>
<var3>New value 3</var3>
</xml_file>
Ich lade file1 mit $xml = simplexml_load_file("path/file1.xml");
Und was ich gerne erreichen möchte, ist, auch file2 zu laden und var3 mit dem Wert in dieser neuen Datei zu überschreiben (Neuer Wert 3).
Ich habe es mit dieser Lösung geschafft, aber ich habe mich gefragt, ob es eine andere gibt, die einfacher und vielleicht schneller ist:
$xml1 = simplexml_load_file("path/file1.xml");
$xml2 = simplexml_load_file("path/file2.xml");
$xml = (object)array_merge((array)$xml1, (array)$xml2);
Danke für deine Ideen;)
Antworten:
0 für die Antwort № 1Iteriere über jede Variable in $xml2
und benutzen xpath
auswählen und ersetzen $xml1
:
foreach ($xml2->children() as $name => $value) {
foreach ($xml1->xpath("//$name") as $replace)
$replace[0] = $value;
}
sehe es funktionieren: https://eval.in/522121
Hinweis: $xml2
ist nur eine Ebene tief. Bei Kindern von Kindern ist ein rekursiver Ansatz erforderlich.
0 für die Antwort № 2
Der XML-Inhalt, den Sie präsentiert haben file1
ist nicht gültig. Das Öffnen und Schließen von Tags muss übereinstimmen:
<xml_file>
<var1>Value 1</var1>
<var2>Value 2</var2>
<var3>Value 3</var3>
</xml_file>
Überschreiben var3
Knotenwert in der ersten XML mit dem entsprechenden Knotenwert aus der zweiten XML Sie können den Wert eines Knotens einfach einem anderen Knoten zuweisen.
$xml1 = simplexml_load_file("path/file1.xml");
$xml2 = simplexml_load_file("path/file2.xml");
$xml1->var3 = $xml2->var3;
var_dump($xml1->asXML());
// the output:
string "<?xml version="1.0"?>
<xml_file>
<var1>Value 1</var1>
<var2>Value 2</var2>
<var3>New value 3</var3>
</xml_file>
" (length=124)
AKTUALISIEREN
Ein zusätzlicher Ansatz für das Ersetzen mehrerer Knotenwerte. Es verwendet array_intersect_key
Funktion, die ein Array zurückgibt, das alle Einträge von enthält $xml2
welche Schlüssel haben, die in vorhanden sind $xml1
:
$xml1 = simplexml_load_string("<xml_file>
<var1>Value 1</var1>
<var2>Value 2</var2>
<var3>Value 3</var3>
<var4>Value 4</var4>
<var5>Value 4</var5>
</xml_file>");
$xml2 = simplexml_load_string("<xml_file>
<var3>New value 3</var3>
<var5>New Value 5</var5>
</xml_file>");
$matches = array_intersect_key((array)$xml2, (array) $xml1);
foreach ($matches as $node_name => $v) {
$xml1->$node_name = $v; // $v is a node value from $xml2
}
var_dump($xml1->asXML());
// the output:
string "<?xml version="1.0"?>
<xml_file>
<var1>Value 1</var1>
<var2>Value 2</var2>
<var3>New value 3</var3>
<var4>Value 4</var4>
<var5>New Value 5</var5>
</xml_file>
" (length=178)
http://php.net/manual/en/function.array-intersect-key.php