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 16 Python
在Python中处理列表之reverse()方法的使用教程
May 21 Python
python制作一个桌面便签软件
Aug 09 Python
python记录程序运行时间的三种方法
Jul 14 Python
对numpy中二进制格式的数据存储与读取方法详解
Nov 01 Python
基于Django统计博客文章阅读量
Oct 29 Python
python数据分析:关键字提取方式
Feb 24 Python
python实现信号时域统计特征提取代码
Feb 26 Python
python 画条形图(柱状图)实例
Apr 24 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
Jun 24 Python
python获取整个网页源码的方法
Aug 03 Python
python实现按日期归档文件
Jan 30 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 zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
js查找节点的方法小结
2015/01/13 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
2016/09/17 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
vue2.0中goods选购栏滚动算法的实现代码
2017/05/17 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
vue滚动固定顶部及修改样式的实例代码
2019/05/30 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
DWR内存兼容及无法调用问题解决方案
2020/10/16 Javascript
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python时间整形转标准格式的示例分享
2014/02/14 Python
对Python强大的可变参数传递机制详解
2019/06/13 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
python类的实例化问题解决
2019/08/31 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
英国在线电子和小工具商店:TecoBuy
2018/10/06 全球购物
某个公司的Java笔面试题
2016/03/11 面试题
招聘与培训专员岗位职责
2014/01/30 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
大学生上课迟到检讨书
2014/10/15 职场文书
社区元宵节活动总结
2015/02/06 职场文书
质量整改通知单
2015/04/21 职场文书
2015年乡镇财政工作总结
2015/05/19 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书