Python实现XML转字典:附指定XML配置示例
Python将XML转换为字典的实现方案
嘿,要把你提供的这类XML转换成Python字典,最省心的方式就是用xmltodict这个第三方库——它专门做XML和Python原生数据结构的互转,语法简洁还能完美处理XML的属性和嵌套结构。
步骤1:安装xmltodict库
首先得把库装到你的环境里,打开终端跑这个命令:
pip install xmltodict
步骤2:编写转换代码
我先把你给出的XML补全(最后那段截断的部分我假设是完整的processing_fee节点),然后写完整的转换示例:
示例XML(补全后)
<?xml version="1.0" encoding="UTF-8"?> <fee_config> <fees member_group="00400F" mail_retail="MAIL"> <admin_fee>0.76</admin_fee> <processing_fee>1.83</processing_fee> </fees> <fees member_group="00400F" mail_retail="RETAIL"> <admin_fee>1.335</admin_fee> <processing_fee>1.645</processing_fee> </fees> <fees member_group="00460G" mail_retail="MAIL"> <admin_fee>0.88</admin_fee> <processing_fee>1.95</processing_fee> </fees> </fee_config>
转换代码
import xmltodict # 如果你是从文件读取XML,用下面的方式 # with open('fee_config.xml', 'r', encoding='utf-8') as f: # xml_content = f.read() # 直接用字符串形式的XML内容 xml_content = """<?xml version="1.0" encoding="UTF-8"?> <fee_config> <fees member_group="00400F" mail_retail="MAIL"> <admin_fee>0.76</admin_fee> <processing_fee>1.83</processing_fee> </fees> <fees member_group="00400F" mail_retail="RETAIL"> <admin_fee>1.335</admin_fee> <processing_fee>1.645</processing_fee> </fees> <fees member_group="00460G" mail_retail="MAIL"> <admin_fee>0.88</admin_fee> <processing_fee>1.95</processing_fee> </fees> </fee_config>""" # 转换XML为字典,参数dict_constructor=dict确保输出是普通字典 result_dict = xmltodict.parse(xml_content, dict_constructor=dict) # 查看转换后的结果 print(result_dict)
转换后的结构说明
转换后的字典会保留XML的层级关系:
- 根节点
fee_config作为顶层键,对应的是一个包含fees列表的字典 - 每个
fees节点的属性(比如member_group、mail_retail)会以@开头的键存在字典里 - 子节点(比如
admin_fee、processing_fee)直接作为普通键,值就是节点内的文本
比如其中一个fees项的结构是:
{ '@member_group': '00400F', '@mail_retail': 'MAIL', 'admin_fee': '0.76', 'processing_fee': '1.83' }
不用第三方库的方案(标准库实现)
如果不想依赖第三方库,可以用Python标准库的xml.etree.ElementTree来手动解析,代码会繁琐一点,但也能实现:
import xml.etree.ElementTree as ET # 解析XML root = ET.fromstring(xml_content) result_dict = {'fee_config': {'fees': []}} for fees_node in root.findall('fees'): fee_item = { 'member_group': fees_node.attrib.get('member_group'), 'mail_retail': fees_node.attrib.get('mail_retail'), 'admin_fee': fees_node.find('admin_fee').text, 'processing_fee': fees_node.find('processing_fee').text } result_dict['fee_config']['fees'].append(fee_item) print(result_dict)
这个方案需要手动遍历节点和属性,适合对XML结构完全明确的场景。
内容的提问来源于stack exchange,提问作者Snow
相关产品推荐
相关产品推荐

