python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python 字典和xml互相转换

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

作者:需要休息的KK.

xmltodict是一个Python第三方库,用于处理XML数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

xmltodict简介

概念

xmltodict按照

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

pip install xmltodict

生成XML数据

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

参数含义如下:

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数据。

参数含义如下:

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互相转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文