如何使用Pandas DataFrame.to_xml避免生成行或根重复元素?
解决pandas to_xml生成多余元素的问题
要匹配你提供的XSD结构,让<TEST>直接包含Content1等子元素(无<row>节点),可以通过以下两种实现方式:
方法一:利用pandas内置参数(推荐)
通过设置elements_only=True跳过根元素生成,同时将row_name指定为TEST,再手动添加XML声明,就能直接得到符合要求的XML:
import pandas as pd for idx in range(df.shape[0]): # 提取单行数据 single_row = df.iloc[idx:idx+1] # 过滤空值列(适配Content5可选的要求) single_row_clean = single_row.dropna(axis=1, how='all') # 生成仅包含TEST节点的XML片段 row_xml = single_row_clean.to_xml(row_name="TEST", index=False, elements_only=True) # 拼接完整XML内容 full_xml = '<?xml version="1.0" encoding="utf-8"?>\n' + row_xml # 写入文件(注意文件名区分不同行) with open(f"{base_path}/test_{idx}.xml", 'w', encoding='utf-8') as f: f.write(full_xml)
生成的XML示例:
<?xml version="1.0" encoding="utf-8"?> <TEST> <Content1>123</Content1> <Content2>abc</Content2> <Content3>242136</Content3> <Content4>90°</Content4> </TEST>
方法二:生成后移除标签
如果需要保留原有root_name设置,也可以先生成带<row>的XML,再通过正则替换去掉多余节点:
import pandas as pd import re for row_idx in range(df.shape[0]): df1 = df.iloc[row_idx:row_idx+1] # 生成带row节点的XML raw_xml = df1.to_xml(root_name="TEST", index=False) # 移除row标签及周围空白 cleaned_xml = re.sub(r'\s*<row>\s*|\s*</row>\s*', '', raw_xml) # 写入文件 with open(f"{base_path}/test_{row_idx}.xml", 'w', encoding='utf-8') as f: f.write(cleaned_xml)
关键说明
elements_only=True:告诉to_xml只生成行对应的元素,不包裹根节点row_name="TEST":将行元素的名称设为目标根节点名TESTdropna(axis=1, how='all'):自动过滤空值列,适配XSD中Content5可选的要求(空值时不生成该节点)
内容的提问来源于stack exchange,提问作者sa-biene
相关产品推荐
相关产品推荐

