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');
我遇到了 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');