PHP XMLWriter递归处理数组:如何保持节点与数据顺序一致?
PHP XMLWriter递归生成XML节点顺序不符的解决办法
我们使用以下虚拟数组结构来讨论问题:
$data = [ 'lvl1' => [ 'lvl2' => [ 'lvl3' => 'data3' ], 'val2' => 'data2' ] ];
当前使用PHP的XMLWriter类在内存中创建XML文档的代码:
$xml = new XMLWriter(); $xml->openMemory(); $xml->startDocument(); $xml->startElement('p'); $xml->text("Test"); $xml->endElement(); recursiveNodes($data, $xml); $xml->endDocument(); print($xml->outputMemory());
现有的递归处理函数:
function recursiveNodes(array $data, XMLWriter $xml) : XMLWriter { foreach ($data as $node) { if (is_array($node)) { recursiveNodes($node, $xml); } else { $xml->writeElement($node); } } return $xml; }
问题:希望在<p>节点后按数组的层级顺序添加子节点,但当前递归函数会优先添加最深层的节点,不符合数组呈现的顺序要求。
修改后的递归函数
问题根源在于原函数没有处理数组的键名,也没有为子数组创建对应的父元素标签。修改后需要同时遍历键与值,遇到数组时先创建以键名为标签的元素,再递归处理子内容,以此保证节点顺序与数组结构一致:
function recursiveNodes(array $data, XMLWriter $xml): XMLWriter { foreach ($data as $key => $value) { if (is_array($value)) { $xml->startElement($key); recursiveNodes($value, $xml); $xml->endElement(); } else { $xml->writeElement($key, $value); } } return $xml; }
生成的XML效果
修改后运行代码,输出的XML结构如下:
<?xml version="1.0"?> <p>Test</p> <lvl1> <lvl2> <lvl3>data3</lvl3> </lvl2> <val2>data2</val2> </lvl1>
该结构完全匹配原数组的层级与顺序:lvl1作为根级元素,内部先出现lvl2子元素(包含lvl3),再出现val2元素,和数组的呈现顺序一致。
内容的提问来源于stack exchange,提问作者HeckMeck
相关产品推荐
相关产品推荐

