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 相关文章推荐
PHP webshell检查工具 python实现代码
Sep 15 Python
Python求两个list的差集、交集与并集的方法
Nov 01 Python
python实现的简单抽奖系统实例
May 22 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
Mar 30 Python
Python中with及contextlib的用法详解
Jun 08 Python
Python入门之三角函数全解【收藏】
Nov 08 Python
单链表反转python实现代码示例
Feb 08 Python
mac安装scrapy并创建项目的实例讲解
Jun 13 Python
pycharm运行scrapy过程图解
Nov 22 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 Python
python 19个值得学习的编程技巧
Aug 15 Python
python 指定源路径来解决import问题的操作
Mar 04 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
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
PHP 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
PHP中$_SERVER使用说明
2015/07/05 PHP
如何通过PHP实现Des加密算法代码实例
2020/05/09 PHP
ejs v9 javascript模板系统
2012/03/21 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
Vue Ajax跨域请求实例详解
2017/06/20 Javascript
windows下更新npm和node的方法
2017/11/30 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
vue实现简易计算器功能
2021/01/20 Vue.js
给Python入门者的一些编程建议
2015/06/15 Python
Python单链表简单实现代码
2016/04/27 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
2018/01/30 Python
Python OpenCV获取视频的方法
2018/02/28 Python
Django基于ORM操作数据库的方法详解
2018/03/27 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
2018/05/18 Python
Win8下python3.5.1安装教程
2020/07/29 Python
pyqt5的QComboBox 使用模板的具体方法
2018/09/06 Python
实例讲解python中的序列化知识点
2018/10/08 Python
对python中的装包与解包实例详解
2019/08/24 Python
妇女儿童发展规划实施方案
2014/03/16 职场文书
勿忘国耻9.18演讲稿(经典篇)
2014/09/14 职场文书
电力安全教育培训心得体会
2016/01/11 职场文书
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js
opencv检测动态物体的实现
2021/07/21 Python
redis lua限流算法实现示例
2022/07/15 Redis