我遇到了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>
我必须遗漏一些东西,但是......这就是问题......
感谢您的帮助!
答案 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');