将XML文档与PHP合并

时间:2010-07-20 12:42:28

标签: php xml dom

我有这两个xml文档:

XML 1:

<outer>
    <foo>
        <foo-child name="fA" special="true">
            content of fA
        </foo-child>
        <foo-child name="fB">
            content of fB
        </foo-child>
    </foo>
    <bar>
        <bar-child name="bA">
            content of bA
        </bar-child>
        <bar-child name="bB" special="true">
            content of bB
        </bar-child>
    </foo>
</outer>

XML 2:

<outer>
    <foo>
        <foo-child name="fA">
            newer and improved content of fA
        </foo-child>
        <foo-child name="fC">
            content of fC
        </foo-child>
    </foo>
    <bar>
        <bar-child name="bA" really-special="true" />
        <bar-child name="bB" special="false">
            Despecialized content of bB
        </bar-child>
    </foo>
</outer>

我想将它们合并在一起,以便文档2中的元素覆盖文档1中具有相同name属性的元素。如果第二个文档中不存在任何属性或内容,则从第一个文档继承。所以:

联合

<outer>
    <foo>
        <foo-child name="fA" special="true">
            newer and improved content of fA
        </foo-child>
        <foo-child name="fB">
            content of fB
        </foo-child>
        <foo-child name="fC">
            content of fC
        </foo-child>
    </foo>
    <bar>
        <bar-child name="bA" really-special="true">
            content of bA
        </bar-child>
        <bar-child name="bB">
            Despecialized content of bB
        </bar-child>
    </foo>
</outer>

我的目的是使用PHP在服务器端执行此操作。

但是,我不确定这是DomDocument还是SimpleXML的工作。我还没有真正使用过,并继续思考“我希望我有jQuery”。

这个问题有一个简单的解决方案吗?

2 个答案:

答案 0 :(得分:0)

选择SimpleXML是正确的道路,可能更容易。这是一个关于如何使用它的好教程:

Introduction To SimpleXML With PHP

答案 1 :(得分:0)

现在链接很好。我同意Sarfraz的说法,这是一个很好的解决方案,可以通过PHP manual page的评论将XML与SImpleXML合并,同时也可以使用属性:

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);
    }
} 

还有使用样本。