/ / XML-Variable mit simplexml zusammenführen oder überschreiben - php, xml, merge, simplexml

Mischen oder überschreiben Sie die xml-Variable mit simplexml - php, xml, merge, simplexml

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 № 1

Iteriere ü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