概念
xmltodict模块属于Python第三方库,需要额外下载安装,命令如下:
1 |
pip install xmltodict |
unparser函数用于将Python字典转换为XML数据,便于数据的存储和传输;
参数含义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import xmltodict
# Python 字典 data = { 'persons': { 'person': [ { 'name': '张三', 'age': '18', 'gender': '男', 'address': {'street': '浦东大道', 'district': '浦东新区', 'city': '上海', 'state': '中国'} }, { 'name': '李四', 'age': '20', 'gender': '女', 'address': {'street': '蓝靛厂路', 'district': '海淀区', 'city': '北京', 'state': '中国'}} ] } }
# 将字典转换为 XML 数据 xml_string = xmltodict.unparse(data, pretty=True)
# 打印 XML 数据 print(xml_string) # <?xml version="1.0" encoding="utf-8"?> # <persons> # <person> # <name>张三</name> # <age>18</age> # <gender>男</gender> # <address> # <street>浦东大道</street> # <district>浦东新区</district> # <city>上海</city> # <state>中国</state> # </address> # </person> # <person> # <name>李四</name> # <age>20</age> # <gender>女</gender> # <address> # <street>蓝靛厂路</street> # <district>海淀区</district> # <city>北京</city> # <state>中国</state> # </address> # </person> # </persons> |
parse函数将XML数据解析为Python字典,使得你可以使用Python的语法来访问和操作XML数据。
参数含义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import xmltodict
# XML 数据 xml_string = ''' <persons> <person> <name>张三</name> <age>18</age> <gender>男</gender> <address> <street>浦东大道</street> <district>浦东新区</district> <city>上海</city> <state>中国</state> </address> </person> <person> <name>李四</name> <age>20</age> <gender>女</gender> <address> <street>蓝靛厂路</street> <district>海淀区</district> <city>北京</city> <state>中国</state> </address> </person> </persons> '''
# 解析 XML 数据 data = xmltodict.parse(xml_string) print(type(data), data) # <class 'dict'> {'persons': {'person': [{'name': '张三', 'age': '18', 'gender': '男', 'address': {'street': '浦东大道', 'district': '浦东新区', 'city': '上海', 'state': '中国'}}, {'name': '李四', 'age': '20', 'gender': '女', 'address': {'street': '蓝靛厂路', 'district': '海淀区', 'city': '北京', 'state': '中国'}}]}}
# 访问数据 print(data['persons']['person'][0]['name']) # 输出: 张三 print(data['persons']['person'][1]['name']) # 输出: 李四 |
attr_prefix参数用于指定XML属性在转换为字典时的键前缀。默认值是’@'。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import xmltodict
xml_string = ''' <persons> <person name="zhangsan" age="18" gender="男"> <address>上海市浦东新区</address> </person> <person name="lisi" age="20" gender="女"> <address>北京市海淀区</address> </person> </persons> '''
# data1 = xmltodict.parse(xml_string) print(data1) # 使用默认的attr_prefix='@'参数值,输出如下: # {'persons': # { # 'person': [ # {'@name': 'zhangsan', '@age': '18', '@gender': '男', 'address': '上海市浦东新区'}, # {'@name': 'lisi', '@age': '20', '@gender': '女', 'address': '北京市海淀区'} # ] # } # }
data2 = xmltodict.parse(xml_string, attr_prefix='attr_') print(data2) # 使用自定义attr_prefix='attr_'参数值,输出如下: # {'persons': # { # 'person': [ # {'attr_name': 'zhangsan', 'attr_age': '18', 'attr_gender': '男', 'address': '上海市浦东新区'}, # {'attr_name': 'lisi', 'attr_age': '20', 'attr_gender': '女', 'address': '北京市海淀区'} # ] # } # } |
strip_whitespace参数用于控制是否去除文本值中的空白字符。默认值是True。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import xmltodict
xml_string = ''' <person name="zhangsan"> <address> 上海市浦东新区</address> </person> '''
# strip_whitespace=True (默认) data1 = xmltodict.parse(xml_string) print(data1) # {'person': {'@name': 'zhangsan', 'address': '上海市浦东新区'}}
# strip_whitespace=False data2 = xmltodict.parse(xml_string, strip_whitespace=False) print(data2) # {'person': {'@name': 'zhangsan', 'address': ' 上海市浦东新区', '#text': '\n \n'}} |
利用postprocessor钩子指定一个按照预想逻辑处理key、value值的函数;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
import xmltodict
xml_string = ''' <persons> <person> <name>张三</name> <age>18</age> <gender>男</gender> <address> <street></street> <district desc="test">浦东新区</district> <city></city> <state>中国</state> </address> </person> <person> <name>李四</name> <age>20</age> <gender>女</gender> <address> <street></street> <district desc="test"></district> <city>北京</city> <state>中国</state> </address> </person> </persons> '''
def _remove_empty(_, key, value): if value is None: return return key, value
result1 = xmltodict.parse(xml_string) result2 = xmltodict.parse(xml_string, postprocessor=_remove_empty)
print(result1['persons']['person'][0]['address']) # 输出: {'street': None, 'district': {'@desc': 'test', '#text': '浦东新区'}, 'city': None, 'state': '中国'} print(result2['persons']['person'][0]['address']) # 输出: {'district': {'@desc': 'test', '#text': '浦东新区'}, 'state': '中国'}
print(result1['persons']['person'][1]['address']) # 输出: {'street': None, 'district': {'@desc': 'test'}, 'city': '北京', 'state': '中国'} print(result2['persons']['person'][1]['address']) # 输出: {'district': {'@desc': 'test'}, 'city': '北京', 'state': '中国'} |
xmltodict模块是处理XML数据的强大工具,它结合了XML的灵活性和Python字典的简便性;
无论是需要解析复杂的XML文档,还是需要生成结构化的XML数据,xmltodict都能简单而又直观的胜任;
通过将XML处理过程与Python字典操作相结合,xmltodict极大地简化了XML数据的处理流程,使得开发者可以更加专注于业务逻辑的实现。