Рекурсивно объединить два XML-файла - PullRequest
8 голосов
/ 17 июня 2011

Я хочу объединить 2 файла XML в один рекурсивно.Например:

1-й файл:

<root>
    <branch1>
        <node1>Test</node1>
    </branch1>
    <branch2>
        <node>Node from 1st file</node>
    </branch2>
</root>

2-й файл:

<root>
    <branch1>
        <node2>Test2</node2>
    </branch1>
    <branch2>
        <node>This node should overwrite the 1st file branch</node>
    </branch2>
    <branch3>
        <node>
            <subnode>Yeah</subnode>
        </node>
    </branch3>
</root>

Объединенный файл:

<root>
    <branch1>
        <node1>Test</node1>
        <node2>Test2</node2>
    </branch1>
    <branch2>
        <node>This node should overwrite the 1st file branch</node>
    </branch2>
    <branch3>
        <node>
            <subnode>Yeah</subnode>
        </node>
    </branch3>
</root>

Я хочу, чтобы второй файл был добавлен в первый файл.Конечно, объединение может быть выполнено с любой глубиной XML.

Я искал в Google и не нашел скрипт, который работал правильно.

Можете ли вы мне помочь, пожалуйста?

Ответы [ 2 ]

4 голосов
/ 17 июня 2011

xml2array - это функция, которая преобразует документ XML в массив.После создания двух массивов вы можете использовать array_merge_recursive для их объединения.Затем вы можете преобразовать массив обратно в xml с помощью XmlWriter (должен быть уже установлен).

0 голосов
/ 28 февраля 2014

Это хорошее решение из комментария на странице справки по PHP , работающей также с атрибутами:

function append_simplexml(&$simplexml_to, &$simplexml_from)
{
    foreach ($simplexml_from->children() as $simplexml_child)
    {
        $simplexml_temp = $simplexml_to->addChild($simplexml_child->getName(), (string) $simplexml_child);
        foreach ($simplexml_child->attributes() as $attr_key => $attr_value)
        {
            $simplexml_temp->addAttribute($attr_key, $attr_value);
        }

        append_simplexml($simplexml_temp, $simplexml_child);
    }
} 

Также есть пример использования.

...