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

时间:2015-04-07 17:19:27

标签: php xml simplexml

我遇到了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中,我得到了一个simplexmlobject,这很好,但是如果我转储$ combination-&gt;组合[$ x],我会得到一大堆空白...... < / p>

我想得到:

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

我必须遗漏一些东西,但是......这就是问题......

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

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

重要的部分是$c[0]。您还可以使用数字编写$c->{0}以进行属性访问。示例输出(可以api调用返回&#34; apiCall($paramter)&#34;作为字符串):

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