Python将字典转换为XML的方法


Posted in Python onAugust 01, 2020

问题

你想使用一个Python字典存储数据,并将它转换成XML格式。

解决方案

尽管 xml.etree.ElementTree 库通常用来做解析工作,其实它也可以创建XML文档。 例如,考虑如下这个函数:

from xml.etree.ElementTree import Element

def dict_to_xml(tag, d):
'''
Turn a simple dict of key/value pairs into XML
'''
elem = Element(tag)
for key, val in d.items():
  child = Element(key)
  child.text = str(val)
  elem.append(child)
return elem

下面是一个使用例子:

>>> s = { 'name': 'GOOG', 'shares': 100, 'price':490.1 }
>>> e = dict_to_xml('stock', s)
>>> e
<Element 'stock' at 0x1004b64c8>
>>>

转换结果是一个 Element 实例。对于I/O操作,使用 xml.etree.ElementTree 中的 tostring() 函数很容易就能将它转换成一个字节字符串。例如:

>>> from xml.etree.ElementTree import tostring
>>> tostring(e)
b'<stock><price>490.1</price><shares>100</shares><name>GOOG</name></stock>'
>>>

如果你想给某个元素添加属性值,可以使用 set() 方法:

>>> e.set('_id','1234')
>>> tostring(e)
b'<stock _id="1234"><price>490.1</price><shares>100</shares><name>GOOG</name>
</stock>'
>>>

如果你还想保持元素的顺序,可以考虑构造一个 OrderedDict 来代替一个普通的字典。请参考1.7小节。

讨论

当创建XML的时候,你被限制只能构造字符串类型的值。例如:

def dict_to_xml_str(tag, d):
  '''
  Turn a simple dict of key/value pairs into XML
  '''
  parts = ['<{}>'.format(tag)]
  for key, val in d.items():
    parts.append('<{0}>{1}</{0}>'.format(key,val))
  parts.append('</{}>'.format(tag))
  return ''.join(parts)

问题是如果你手动的去构造的时候可能会碰到一些麻烦。例如,当字典的值中包含一些特殊字符的时候会怎样呢?

>>> d = { 'name' : '<spam>' }

>>> # String creation
>>> dict_to_xml_str('item',d)
'<item><name><spam></name></item>'

>>> # Proper XML creation
>>> e = dict_to_xml('item',d)
>>> tostring(e)
b'<item><name><spam></name></item>'
>>>

注意到程序的后面那个例子中,字符 ‘<' 和 ‘>' 被替换成了 < 和 >

下面仅供参考,如果你需要手动去转换这些字符, 可以使用 xml.sax.saxutils 中的 escape() unescape() 函数。例如:

>>> from xml.sax.saxutils import escape, unescape
>>> escape('<spam>')
'<spam>'
>>> unescape(_)
'<spam>'
>>>

除了能创建正确的输出外,还有另外一个原因推荐你创建 Element 实例而不是字符串, 那就是使用字符串组合构造一个更大的文档并不是那么容易。 而 Element 实例可以不用考虑解析XML文本的情况下通过多种方式被处理。 也就是说,你可以在一个高级数据结构上完成你所有的操作,并在最后以字符串的形式将其输出。

以上就是Python将字典转换为XML的方法的详细内容,更多关于Python将字典转换为XML的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python查找目录下指定扩展名的文件实例
Apr 01 Python
Python实现SMTP发送邮件详细教程
Mar 02 Python
python进阶_浅谈面向对象进阶
Aug 17 Python
python:print格式化输出到文件的实例
May 14 Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
python中的for循环
Sep 28 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
利用Pyhton中的requests包进行网页访问测试的方法
Dec 26 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
pycharm内无法import已安装的模块问题解决
Feb 12 Python
Python中使用filter过滤列表的一个小技巧分享
May 02 Python
Pytorch 使用 nii数据做输入数据的操作
May 26 Python
Python Flask异步发送邮件实现方法解析
Aug 01 #Python
Python实现弹球小游戏
Aug 01 #Python
序列化Python对象的方法
Aug 01 #Python
Python 忽略文件名编码的方法
Aug 01 #Python
Python 如何展开嵌套的序列
Aug 01 #Python
Python 日期与时间转换的方法
Aug 01 #Python
Python 执行矩阵与线性代数运算
Aug 01 #Python
You might like
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
一个PHP实现的轻量级简单爬虫
2015/07/08 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
dojo 之基础篇(二)之从服务器读取数据
2007/03/24 Javascript
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
JS面向对象编程浅析
2011/08/28 Javascript
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
BootStrap fileinput.js文件上传组件实例代码
2017/02/20 Javascript
js实现二级导航功能
2017/03/03 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
加速vue组件渲染之性能优化
2020/04/09 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
[02:54]DOTA2英雄基础教程 暗影牧师戴泽
2013/12/05 DOTA
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
python中使用urllib2伪造HTTP报头的2个方法
2014/07/07 Python
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
python开发之for循环操作实例详解
2015/11/12 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
python标记语句块使用方法总结
2019/08/05 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
python制作朋友圈九宫格图片
2019/11/03 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
自动一体化专业求职信
2014/03/15 职场文书
可口可乐广告词
2014/03/20 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
优秀高中学生评语
2014/12/30 职场文书
小学生手册家长意见
2015/06/03 职场文书
Python  lambda匿名函数和三元运算符
2022/04/19 Python