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 相关文章推荐
利用Psyco提升Python运行速度
Dec 24 Python
cmd运行python文件时对结果进行保存的方法
May 16 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
Feb 11 Python
numpy基础教程之np.linalg
Feb 12 Python
Python动态语言与鸭子类型详解
Jul 01 Python
PyTorch中常用的激活函数的方法示例
Aug 20 Python
python实现机器人卡牌
Oct 06 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 Python
Python extract及contains方法代码实例
Sep 11 Python
Python urllib3软件包的使用说明
Nov 18 Python
Python基本数据类型之字符串str
Jul 21 Python
Selenium浏览器自动化如何上传文件
Apr 06 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不用正则采集速度探究总结
2008/03/24 PHP
PHP函数strip_tags的一个bug浅析
2014/05/22 PHP
PHP中array_map与array_column之间的关系分析
2014/08/19 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
2016/11/14 PHP
PHP房贷计算器实例代码,等额本息,等额本金
2017/04/01 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
一个js实现的所谓的滑动门
2007/05/23 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
jQuery前端分页示例分享
2015/02/10 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
2017/06/22 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
微信小程序修改数组长度的问题的解决
2019/12/17 Javascript
JS自定义对象创建与简单使用方法示例
2020/01/15 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
python消费kafka数据批量插入到es的方法
2018/12/27 Python
python实现远程控制电脑
2019/05/23 Python
Django用户身份验证完成示例代码
2020/04/03 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
Python求区间正整数内所有素数之和的方法实例
2020/10/13 Python
Discard Protocol抛弃协议的作用是什么
2015/10/10 面试题
文体活动实施方案
2014/03/27 职场文书
竞选班干部演讲稿400字
2014/08/20 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
优秀教师先进事迹材料
2014/12/15 职场文书
漫画「你在春天醒来」第10卷封面公开
2022/03/21 日漫
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫