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生成随机密码或随机字符串的方法
Jul 03 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
Jun 23 Python
python进行TCP端口扫描的实现
Dec 21 Python
实例讲解Python中整数的最大值输出
Mar 17 Python
python爬虫的一个常见简单js反爬详解
Jul 09 Python
python自动化测试之DDT数据驱动的实现代码
Jul 23 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
Nov 22 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
pycharm实现在虚拟环境中引入别人的项目
Mar 09 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
Apr 24 Python
python logging 重复写日志问题解决办法详解
Aug 04 Python
用Python爬虫破解滑动验证码的案例解析
May 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设置进度条的方法
2015/07/08 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
理解Javascript_11_constructor实现原理
2010/10/18 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
node.js中的console用法总结
2014/12/15 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
angularjs的单选框+ng-repeat的实现方法
2018/09/12 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
python将文本转换成图片输出的方法
2015/04/28 Python
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
Python中文编码知识点
2019/02/18 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
Python命令行click参数用法解析
2019/12/19 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
python中如何打包用户自定义模块
2020/09/23 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
社区关爱留守儿童活动方案
2014/08/22 职场文书
企业战略合作意向书
2015/05/08 职场文书
2016年父亲节寄语
2015/12/04 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL
mysql数据库如何转移到oracle
2022/12/24 MySQL