如何在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
相关产品推荐
相关产品推荐

