按属性合并SimpleXML元素

时间:2017-11-06 15:02:11

标签: php xml simplexml

我有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>

1 个答案:

答案 0 :(得分:1)

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复制节点,这样您也可以使用所有dub元素复制内容。