【问题标题】:Merge or override xml variable using simplexml使用 simplexml 合并或覆盖 xml 变量
【发布时间】:2016-06-01 14:08:58
【问题描述】:

我有 2 个 xml 文件 文件1:

<xml_file>
    <var1>Value 1</var1>
    <var2>Value 2</var2>
    <var3>Value 3</var3>
</xml_file>

文件2:

<xml_file>
    <var3>New value 3</var3>
</xml_file>

我使用 $xml = simplexml_load_file("path/file1.xml"); 加载 file1 我希望实现的是加载 file2 并用这个新文件中的值覆盖 var3(新值 3)。

我设法使用这个解决方案做到了,但我想知道是否还有另一种更简单甚至更快的解决方案:

$xml1 = simplexml_load_file("path/file1.xml");
$xml2 = simplexml_load_file("path/file2.xml");
$xml = (object)array_merge((array)$xml1, (array)$xml2);

感谢您的想法;)

【问题讨论】:

  • 你拥有的是 3 行代码。您期望有多容易?
  • 哈哈 :) 你是对的,但我的意思是一个更好的解决方案,使用更少的资源......
  • 只替换根目录下一级或任何级别的值?
  • 我永远只有一个关卡

标签: php xml merge simplexml


【解决方案1】:

遍历$xml2 中的每个变量并使用xpath 选择并替换$xml1 中的变量:

foreach ($xml2->children() as $name => $value) {
    foreach ($xml1->xpath("//$name") as $replace) 
        $replace[0] = $value;
}

看到它的工作:https://eval.in/522121

注意:$xml2 只有一层深。如果有children的children,则需要递归的方法。

【讨论】:

  • 感谢 michi 的脚本。我会尝试一下,然后让你知道;)所以只是我的信息,为什么你的解决方案比 array_merge() 更好? :)
  • @Websphere 这是给你的 :)
【解决方案2】:

您从file1 提供的 xml 内容无效。开始和结束标签必须重合:

<xml_file>
    <var1>Value 1</var1>
    <var2>Value 2</var2>
    <var3>Value 3</var3>
</xml_file>

要使用第二个 xml 中的相应节点值覆盖第一个 xml 中的 var3 节点值,您可以简单地将一个节点的值分配给另一个节点。

$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)

更新
多节点值替换的另一种方法。它使用array_intersect_key 函数返回一个数组,其中包含$xml2 的所有条目,这些条目具有$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

【讨论】:

  • 嗨 Roman,抱歉结束标签,这只是一个错误,我应该责怪复制/粘贴:D 在示例中,我给出了覆盖 var3 的示例,但它不可能我在 xml 文件中有数百个变量!所以我不能使用分配解决方案:/
  • 请详细说明,应该在什么条件下进行这些替换。在您的问题中,只打算使用 var3 节点。完整的条件是什么?
  • file2 中的每个变量也存在于 file1 中。因此,如果任何变量都在 file2 中,它必须替换 file1 中的变量
  • @Websphere,检查我的其他方法
  • 太好了,非常感谢,现在我必须在我的解决方案、你的解决方案和 michi 的解决方案之间做出选择:/ 这有点困难:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2020-02-17
  • 2013-04-27
相关资源
最近更新 更多