Php xml,用 xml 对象替换正在使用的节点

Php xml, replace node in use with an xml object

我遇到了 Xml 问题。可能有些愚蠢,但我看不到...

这是我的 Xml 开头:

<combinations nodeType="combination" api="combinations">
    <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/1">
        <id><![CDATA[1]]></id>
    </combination>
    <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/2">
        <id><![CDATA[2]]></id>
    </combination>
</combinations>

所以对于每个节点,我调用 API 然后我想用返回值替换节点,就像这样:

$c_index = 0;
foreach($combinations->combination as $c){
    $new = apiCall($c->id); //load the new content
    $combinations->combination[$c_index] = $new;
    $c_index++;
}

如果我将 $new 转储到 foreach 中,我得到一个简单的 xml 对象,这很好,但如果我转储 $combinations->combination[$x],我得到一大串空白...

我想得到:

<combinations nodeType="combination" api="combinations">
    <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/1">
        <my new tree>
            ....
        </my new tree>
    </combination>
    <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/2">
        <my new tree>
            ....
        </my new tree>
    </combination>
</combinations>

我一定是漏掉了什么,但是什么...?就是这个问题...

感谢您的帮助!

您可以通过使用所谓的 SimpleXMLElement-self-reference[=28= 来更改 foreach 迭代的当前元素 $c ]。根据 SimpleXMLElement 数组访问或 属性 数字访问的条目 0(零)表示元素本身。这可用于更改元素值,例如:

foreach ($combinations->combination as $c) {
    $new  = apiCall($c->id); //load the new content
    $c[0] = $new;
}

重要的部分是$c[0]这里。您也可以写 $c->{0} 用于 属性 使用数字访问。示例输出(可以 api 调用 returns "apiCall($paramter)" 作为字符串):

<combinations nodeType="combination" api="combinations">
    <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/1">apiCall('1')</combination>
    <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/2">apiCall('2')</combination>
</combinations>

完整示例:

$buffer = <<<XML
<root xmlns:xlink="ns:1">
    <combinations nodeType="combination" api="combinations">
        <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/1">
            <id><![CDATA[1]]></id>
        </combination>
        <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/2">
            <id><![CDATA[2]]></id>
        </combination>
    </combinations>
</root>
XML;


function apiCall($string)
{
    return sprintf('apiCall(%s)', var_export((string)$string, true));
}

$xml = simplexml_load_string($buffer);

$combinations = $xml->combinations;

foreach ($combinations->combination as $c) {
    $new  = apiCall($c->id); //load the new content
    $c[0] = $new;
}

$combinations->asXML('php://output');