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性能优化技巧
Mar 09 Python
Python使用numpy模块创建数组操作示例
Jun 20 Python
python寻找list中最大值、最小值并返回其所在位置的方法
Jun 27 Python
对Python Class之间函数的调用关系详解
Jan 23 Python
Django 缓存配置Redis使用详解
Jul 23 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
Oct 28 Python
在django中自定义字段Field详解
Dec 03 Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 Python
django为Form生成的label标签添加class方式
May 20 Python
利用python控制Autocad:pyautocad方式
Jun 01 Python
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 Python
Python Pandas 删除列操作
Mar 16 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+XML 制作简单的留言本 图文教程
2009/11/02 PHP
PHP的一个基础知识 表单提交
2011/07/04 PHP
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
php获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
CI框架学习笔记(二) -入口文件index.php
2014/10/27 PHP
简述php环境搭建与配置
2016/12/05 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
javascript 事件查询综合 推荐收藏
2010/03/10 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
vue-router 按需加载 component: () =&gt; import() 报错的解决
2020/09/22 Javascript
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
python代码实现逻辑回归logistic原理
2019/08/07 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
基于CSS3特效之动画:animation的应用
2013/05/09 HTML / CSS
沙特阿拉伯排名第一的在线时尚购物应用程序:1Zillion
2020/08/08 全球购物
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
什么是表空间(tablespace)和系统表空间(System tablespace)
2013/02/25 面试题
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
2016/11/20 面试题
项目投资意向书
2014/04/01 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
毕业生自荐信范文
2015/03/05 职场文书
正则表达式拆分url实例代码
2022/02/24 Java/Android