如何将DataFrame生成的Python字典转换为指定层级结构的XML?
解决DataFrame转字典后生成指定结构XML的问题
问题背景
现有如下结构的DataFrame:
| Column A | Column B |
|---|---|
| getTitle | status |
| getTitle | timestamp |
| submitBook | title |
| submitBook | date |
| submitBook | numPages |
通过以下代码将其转换为目标字典:
book_dict = df.groupby(['Column A'])['Column B'].agg(list).to_dict()
得到的字典结构:
{'getTitle': ['status','timestamp'], 'submitBook': ['title', 'date', 'numPages']}
原递归转换XML的代码会将列表直接作为节点文本内容,生成的XML不符合需求。期望生成的XML结构为:
<?xml version="1.0" ?> <Books> <getTitle> <status></status> <timestamp></timestamp> </getTitle> <submitBook> <title></title> <date></date> <numPages></numPages> </submitBook> </Books>
解决方案
修改递归函数,增加对值类型的判断:当值为列表时,遍历列表元素创建空的子节点;针对字典类型则递归处理键值对。
修改后的完整代码
import xml.etree.ElementTree as ET import pandas as pd # 构造示例DataFrame data = { 'Column A': ['getTitle', 'getTitle', 'submitBook', 'submitBook', 'submitBook'], 'Column B': ['status', 'timestamp', 'title', 'date', 'numPages'] } df = pd.DataFrame(data) # 转换为目标字典 book_dict = df.groupby(['Column A'])['Column B'].agg(list).to_dict() def create_tree(root, data): if isinstance(data, dict): for k, v in data.items(): child_node = ET.SubElement(root, k) create_tree(child_node, v) elif isinstance(data, list): for item in data: ET.SubElement(root, item) return root # 生成XML根节点并转换 root = ET.Element("Books") create_tree(root, book_dict) # 格式化XML缩进 ET.indent(root, space=" ", level=0) tree = ET.ElementTree(root) # 保存到文件或打印结果 tree.write("output.xml", encoding="utf-8", xml_declaration=True) ET.dump(root)
输出结果
运行代码后生成的XML内容:
<?xml version='1.0' encoding='utf-8'?> <Books> <getTitle> <status /> <timestamp /> </getTitle> <submitBook> <title /> <date /> <numPages /> </submitBook> </Books>
内容的提问来源于stack exchange,提问作者Lilly
相关产品推荐
相关产品推荐

