| 
                            
                                  xmltodict简介概念 
	xmltodict是Python中用于处理XML数据的模块,它可将XML数据转换为字典,简化XML解析过程,同时保留数据结构,便于操作。反之,也可将字典转回XML格式。此模块在处理XML时提供了直观、简洁的接口; xmltodict按照
xmltodict模块属于Python第三方库,需要额外下载安装,命令如下: 生成XML数据unparser函数用于将Python字典转换为XML数据,便于数据的存储和传输; 参数含义如下: 
	input_dict:要转换为XML的Python字典。output(可选):输出的目标。可以是字符串(默认)或文件对象。pretty(可选):是否美化输出。默认为False。full_document(可选):是否输出完整的XML文档,包括XML声明。默认为True。 
	
		
			| 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> |  解析XML数据parse函数将XML数据解析为Python字典,使得你可以使用Python的语法来访问和操作XML数据。 参数含义如下: 
	xml_input:要解析的XML数据。可以是字符串或文件对象。encoding(可选):XML文档的编码。默认为None,意味着使用XML文档中指定的编码。expat(可选):自定义的XML解析器。默认使用Python标准库中的xml.parsers.expat。process_namespaces(可选):是否处理命名空间。默认为False。namespace_separator(可选):当process_namespaces=True时,命名空间和标签名之间的分隔符。默认为:。postprocessor(可选):一个函数,它会在每个元素解析完成后被调用。这允许用户修改解析结果,例如,可以用来转换数据类型或合并节点。它接收三个参数:path、key和value。path是当前元素的父元素路径,key是当前元素的标签名,value是当前元素的值(可能是文本、属性字典或子元素的字典)。dict_constructor(可选):用于创建字典的构造函数。默认情况下,xmltodict使用内置的dict函数来构造字典。如果你想使用其他类型的字典(例如,collections.OrderedDict以保持元素的顺序),可以通过这个参数指定。xml_attribs(可选):控制解析器是否应该包含元素的属性。默认为True,意味着元素的属性会被包含在解析结果中。如果设置为False,则属性将被忽略,只有元素的文本内容和子元素会被包含。 
	
		
			| 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'])  # 输出: 李四 |  拓展1.改变属性前缀
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': '北京市海淀区'} #          ] #      } # } |  2.去除文本值中的空白字符
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'}} |  3.去除空值标签
利用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数据的处理流程,使得开发者可以更加专注于业务逻辑的实现。
 
 |