PHP从数组生成XML:如何移除多余的父节点item
解决PHP数组转XML时移除
item父节点的问题 我来帮你搞定这个问题!你的核心痛点就是代码里自动给数字索引的数组创建了item父节点,咱们直接修改array_to_xml函数的逻辑,就能让子节点直接平铺在<data>下面,不再嵌套item。
问题根源分析
你原来的代码里这一行是关键:
if( is_numeric($key) ){ $key = 'item'; }
当数组是索引数组(数字键)时,它会把键强制改成item,然后创建这个节点来包裹子内容——这就是你不想看到的父节点来源。我们需要把这部分逻辑替换成:直接将数字键对应的数组元素,直接添加到当前的XML父节点中,而不是套一层item。
修改后的完整代码
function array_to_xml($data, $xml_data) { foreach ($data as $key => $value) { // 处理数字键的情况:不创建item节点,直接将值的内容平铺到当前节点 if (is_numeric($key)) { if (is_array($value)) { // 如果值是数组,直接递归处理,把当前xml节点作为父节点 array_to_xml($value, $xml_data); } else { // 如果值不是数组(比如字符串/数字),可以自定义节点名,这里我用了'element',你可以按需修改 $xml_data->addChild('element', htmlspecialchars($value)); } } else { // 关联数组的处理逻辑和原代码一致,不影响已有功能 if (is_array($value)) { $subnode = $xml_data->addChild($key); array_to_xml($value, $subnode); } else { $xml_data->addChild($key, htmlspecialchars($value)); } } } } // 初始化XML根节点 $xml_data = new SimpleXMLElement('<?xml version="1.0"?><data></data>'); // 示例数组(你可以替换成自己的$newArrayXml) $newArrayXml = [ ['name' => '产品A', 'price' => 100], ['name' => '产品B', 'price' => 200] ]; // 执行数组转XML array_to_xml($newArrayXml, $xml_data); // 保存生成的XML文件 $result = $xml_data->asXML('list.xml');
代码逻辑说明
- 当遇到数字键时:
- 如果对应的值是数组,直接递归调用
array_to_xml,把当前的XML节点(比如<data>)作为父节点,这样数组里的子元素会直接加到<data>下面,不会有item包裹。 - 如果对应的值是单个值(比如字符串),我这里给了默认节点名
element,你可以根据业务需求改成合适的名称。
- 如果对应的值是数组,直接递归调用
- 关联数组的处理逻辑和原代码保持一致,不会影响已有功能。
生成的XML效果
修改后,上面的示例数组会生成这样的XML:
<?xml version="1.0"?> <data> <name>产品A</name> <price>100</price> <name>产品B</name> <price>200</price> </data>
完全去掉了讨厌的item父节点,子节点直接平铺在<data>下啦!
内容的提问来源于stack exchange,提问作者Tomas Bajoras
相关产品推荐
相关产品推荐

