按属性合并 SimpleXML 元素
Merge SimpleXML elements by attribute
我有 2 个 SimpleXMLElement
。它们都有相同的元素(相同的ID属性),但标签不同,我想将它们合并在一起。
是否有我可以使用的任何 SimpleXML 函数,或者我是否必须遍历所有元素以生成新的 SimpleXmlElement?
文件 1
<Elements>
<Element ID="352">
<SomeTag35>Some value</SomeTag35>
<SomeTag99>Some other value</SomeTag99>
</Element>
<Element ID="353">
<SomeTag35>A value</SomeTag35>
<SomeTag99>Another value</SomeTag99>
</Element>
</Elements>
文件 2
<Elements>
<Element ID="352">
<SomeTag15>Value</SomeTag15>
<SomeTag44>Value2</SomeTag44>
</Element>
<Element ID="353">
<SomeTag15>Value</SomeTag15>
<SomeTag44>Value</SomeTag44>
</Element>
</Elements>
我正在寻找最终结果
<Elements>
<Element ID="352">
<SomeTag35>Some value</SomeTag35>
<SomeTag99>Some other value</SomeTag99>
<SomeTag15>Value</SomeTag15>
<SomeTag44>Value</SomeTag44>
</Element>
<Element ID="353">
<SomeTag35>A value</SomeTag35>
<SomeTag99>Another value</SomeTag99>
<SomeTag15>Value</SomeTag15>
<SomeTag44>Value</SomeTag44>
</Element>
</Elements>
SimpleXML 非常适合执行这样的简单任务。这个想法是读取第一个文档,然后使用 XPath 在第二个文档中找到相应的元素。然后将第二个文档中的元素复制到第一个中。
$doc1 = simplexml_load_file('file1.xml');
$doc2 = simplexml_load_file('file2.xml');
foreach ( $doc1 as $element ) {
$extraData = $doc2->xpath("//Element[@ID=\"{$element['ID']}\"]");
foreach ( $extraData[0]->children() as $newElements ){
$element->addChild($newElements->getName(), (string)$newElements);
}
}
echo $doc1->asXML();
请注意,这仅适用于简单结构。如果您的文档具有嵌套数据或属性,您最好使用 DOMDocument,您可以在其中使用 importNode
复制节点,这也允许您复制包含所有子元素的内容。
我有 2 个 SimpleXMLElement
。它们都有相同的元素(相同的ID属性),但标签不同,我想将它们合并在一起。
是否有我可以使用的任何 SimpleXML 函数,或者我是否必须遍历所有元素以生成新的 SimpleXmlElement?
文件 1
<Elements>
<Element ID="352">
<SomeTag35>Some value</SomeTag35>
<SomeTag99>Some other value</SomeTag99>
</Element>
<Element ID="353">
<SomeTag35>A value</SomeTag35>
<SomeTag99>Another value</SomeTag99>
</Element>
</Elements>
文件 2
<Elements>
<Element ID="352">
<SomeTag15>Value</SomeTag15>
<SomeTag44>Value2</SomeTag44>
</Element>
<Element ID="353">
<SomeTag15>Value</SomeTag15>
<SomeTag44>Value</SomeTag44>
</Element>
</Elements>
我正在寻找最终结果
<Elements>
<Element ID="352">
<SomeTag35>Some value</SomeTag35>
<SomeTag99>Some other value</SomeTag99>
<SomeTag15>Value</SomeTag15>
<SomeTag44>Value</SomeTag44>
</Element>
<Element ID="353">
<SomeTag35>A value</SomeTag35>
<SomeTag99>Another value</SomeTag99>
<SomeTag15>Value</SomeTag15>
<SomeTag44>Value</SomeTag44>
</Element>
</Elements>
SimpleXML 非常适合执行这样的简单任务。这个想法是读取第一个文档,然后使用 XPath 在第二个文档中找到相应的元素。然后将第二个文档中的元素复制到第一个中。
$doc1 = simplexml_load_file('file1.xml');
$doc2 = simplexml_load_file('file2.xml');
foreach ( $doc1 as $element ) {
$extraData = $doc2->xpath("//Element[@ID=\"{$element['ID']}\"]");
foreach ( $extraData[0]->children() as $newElements ){
$element->addChild($newElements->getName(), (string)$newElements);
}
}
echo $doc1->asXML();
请注意,这仅适用于简单结构。如果您的文档具有嵌套数据或属性,您最好使用 DOMDocument,您可以在其中使用 importNode
复制节点,这也允许您复制包含所有子元素的内容。