/ / Scal lub nadpisuj zmienną xml używając simplexml - php, xml, merge, simplexml

Scal lub zmień zmienną xml za pomocą simplexml - php, xml, merge, simplexml

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

Iteruj 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