You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中为XML主根节点下添加子根节点

解决DataFrame导出XML时添加中间节点的问题

问题描述

我用以下代码将DataFrame导出为XML文件:

df.to_xml('test.xml', index=False, row_name='instance', root_name='file')

生成的XML内容如下:

<file>
  <instance>
    <ID>1</ID>
    <name>John</name>
    <age>32</age>
    <city>London</city>
  </instance>
....
</file>

需要在主根节点<file>下添加额外的<NAMES>节点,让输出XML变为如下格式:

<file>
<NAMES>
  <instance>
    <ID>1</ID>
    <name>John</name>
    <age>32</age>
    <city>London</city>
  </instance>
....
</NAMES>
</file>

解决方案

方法1:利用Pandas的elems_only参数直接构建(推荐)

Pandas 1.3.0及以上版本支持elems_only参数,可单独生成<instance>节点内容,再手动组装外层结构:

import pandas as pd
from lxml import etree

# 示例DataFrame
df = pd.DataFrame({
    'ID': [1, 2],
    'name': ['John', 'Alice'],
    'age': [32, 28],
    'city': ['London', 'Paris']
})

# 生成仅包含instance节点的XML片段
instance_xml = df.to_xml(index=False, row_name='instance', elems_only=True)

# 构建完整XML结构
root = etree.Element('file')
names_node = etree.SubElement(root, 'NAMES')
# 将instance节点片段加载到NAMES节点下
temp_root = etree.fromstring(f'<temp>{instance_xml}</temp>')
for elem in temp_root:
    names_node.append(elem)

# 写入文件,保留格式化
etree.ElementTree(root).write(
    'test.xml',
    encoding='utf-8',
    pretty_print=True,
    xml_declaration=True
)

方法2:先导出临时文件再修改XML结构

如果不想依赖lxml库,可先导出原始XML,再用Python内置的xml.etree.ElementTree修改:

import pandas as pd
import xml.etree.ElementTree as ET
import os

# 导出原始XML到临时文件
df.to_xml('temp.xml', index=False, row_name='instance', root_name='file')

# 解析临时文件
tree = ET.parse('temp.xml')
root = tree.getroot()

# 创建NAMES节点
names_node = ET.Element('NAMES')
# 把所有instance节点移到NAMES下
for instance in list(root):
    names_node.append(instance)
# 将NAMES节点添加到根节点
root.append(names_node)

# 保存修改后的XML
tree.write(
    'test.xml',
    encoding='utf-8',
    xml_declaration=True,
    method='xml'
)

# 删除临时文件
os.remove('temp.xml')

内容的提问来源于stack exchange,提问作者SOK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:40:43