Mam 2 pliki xml plik1:
<xml_file>
<var1>Value 1</var1>
<var2>Value 2</var2>
<var3>Value 3</var3>
</xml_file>
plik2:
<xml_file>
<var3>New value 3</var3>
</xml_file>
Wczytuję plik1 przy użyciu $xml = simplexml_load_file("path/file1.xml");
A co chciałbym osiągnąć to załadować file2 i zastąpić var3 wartością w tym nowym pliku (Nowa wartość 3).
Udało mi się to zrobić za pomocą tego rozwiązania, ale zastanawiałem się, czy istnieje jeszcze jeden łatwiejszy i być może szybszy:
$xml1 = simplexml_load_file("path/file1.xml");
$xml2 = simplexml_load_file("path/file2.xml");
$xml = (object)array_merge((array)$xml1, (array)$xml2);
Dzięki za twoje pomysły;)
Odpowiedzi:
0 dla odpowiedzi № 1Iteruj po każdej zmiennej w $xml2
I użyć xpath
aby wybrać i zamienić w $xml1
:
foreach ($xml2->children() as $name => $value) {
foreach ($xml1->xpath("//$name") as $replace)
$replace[0] = $value;
}
zobacz, jak działa: https://eval.in/522121
Uwaga: $xml2
ma tylko jeden poziom głębokości. Jeśli są dzieci dzieci, konieczne jest podejście rekurencyjne.
0 dla odpowiedzi nr 2
Zawartość xml, którą przedstawiłeś file1
nie jest ważne, znaczniki otwierające i zamykające muszą się pokrywać:
<xml_file>
<var1>Value 1</var1>
<var2>Value 2</var2>
<var3>Value 3</var3>
</xml_file>
Przekroczyć var3
wartość węzła w pierwszym xml z odpowiednią wartością węzła z drugiego xml można po prostu przypisać wartość jednego węzła do drugiego.
$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)
AKTUALIZACJA
Dodatkowe podejście do zastępowania wartości wielu węzłów. To używa array_intersect_key
funkcja, która zwraca tablicę zawierającą wszystkie wpisy $xml2
które mają klucze, które są obecne w $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