当前位置: 代码网 > it编程>前端脚本>Python > Python利用xmltodict实现字典和xml互相转换的示例代码

Python利用xmltodict实现字典和xml互相转换的示例代码

2024年12月05日 Python 我要评论
xmltodict简介概念xmltodict是python中用于处理xml数据的模块,它可将xml数据转换为字典,简化xml解析过程,同时保留数据结构,便于操作。反之,也可将字典转回xml格式。此模块

xmltodict简介

概念

  • xmltodict是python中用于处理xml数据的模块,它可将xml数据转换为字典,简化xml解析过程,同时保留数据结构,便于操作。
  • 反之,也可将字典转回xml格式。此模块在处理xml时提供了直观、简洁的接口;

xmltodict按照

xmltodict模块属于python第三方库,需要额外下载安装,命令如下:

pip install xmltodict

生成xml数据

unparser函数用于将python字典转换为xml数据,便于数据的存储和传输;

参数含义如下:

  • input_dict:要转换为xml的python字典。
  • output(可选):输出的目标。可以是字符串(默认)或文件对象。
  • pretty(可选):是否美化输出。默认为false。
  • full_document(可选):是否输出完整的xml文档,包括xml声明。默认为true。
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,则属性将被忽略,只有元素的文本内容和子元素会被包含。
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属性在转换为字典时的键前缀。默认值是’@'。

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。

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值的函数;

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数据的处理流程,使得开发者可以更加专注于业务逻辑的实现。

到此这篇关于python利用xmltodict实现字典和xml互相转换的示例代码的文章就介绍到这了,更多相关python 字典和xml互相转换内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • Python 文件批量处理操作的实现示例

    Python 文件批量处理操作的实现示例

    在日常的开发和数据处理过程中,我们可能会遇到需要对大量文件进行批量操作的场景。比如,批量重命名文件、批量移动文件、批量修改文件内容等。python 为我们提供了... [阅读全文]
  • Python制表符\t的具体使用

    ‌在python中,制表符(\t)的主要作用包括代码缩进和数据对齐。‌‌制表符(\t)在python中用于插入一个制表符,这个制表符在cmd中通常占据…

    2024年12月04日 前端脚本
  • 使用Python中wordcloud库绘制词云图的详细教程

    使用Python中wordcloud库绘制词云图的详细教程

    前言词云图(word cloud)是数据可视化中常用的一种技术,通过将文字以不同的大小、颜色和方向排列,以展示文本数据中词汇的频次和重要性。对于文本分析、情感分... [阅读全文]
  • python numpy linspace函数使用详解

    python numpy linspace函数前言用plt画图的时候,偶尔会看到这个函数的出现,索性直接深入源码实战进行复现主要功能:在线性区域中生成等间距的序列,原先在numpy…

    2024年12月04日 前端脚本
  • pandas 数据透视和逆透视的实现

    本篇介绍 pandas 数据重塑的几个有用变换。假设我们有学生语数外考试的成绩数据,大家常见的是这种格式:如果数据放在数据库中,下面的格式比较符合数据库范式:现在,任务来了。要实现…

    2024年12月06日 前端脚本
  • pandas中使用数据透视表的示例代码

    什么是透视表?经常做报表的小伙伴对数据透视表应该不陌生,在excel中利用数据透视表可以快速地进行分类汇总,自由组合字段快速计算,而这些只需要拖拉拽就可以实现。维基百科对透视表(p…

    2024年12月06日 前端脚本

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com