按属性合并 SimpleXML 元素

Posted

技术标签:

【中文标题】按属性合并 SimpleXML 元素【英文标题】:Merge SimpleXML elements by attribute 【发布时间】:2018-04-18 18:52:36 【问题描述】:

我有 2 个SimpleXMLElements。它们都有相同的元素(相同的 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】:

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 复制节点,这样您也可以复制包含所有子元素的内容。

【讨论】:

这非常有效。抱歉,我目前没有足够的声誉来支持您的回答,但非常感谢您

以上是关于按属性合并 SimpleXML 元素的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SimpleXml 访问元素属性? [复制]

xml 元素中的属性不在 simplexml 数组中

PHP SimpleXML解析具有多个属性的元素

simplexml_load_file 和 simplexml_load_string 之间的区别

PHP 5 SimpleXML 函数

在 SimpleXML for PHP 中删除具有特定属性的子项