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 相关文章推荐
Tornado服务器中绑定域名、虚拟主机的方法
Aug 22 Python
Python 基础教程之str和repr的详解
Aug 20 Python
Python实现将HTML转成PDF的方法分析
May 04 Python
Pandas之ReIndex重新索引的实现
Jun 25 Python
python打造爬虫代理池过程解析
Aug 15 Python
详解Python 中sys.stdin.readline()的用法
Sep 12 Python
使用python处理题库表格并转化为word形式的实现
Apr 14 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 20 Python
利用PyTorch实现VGG16教程
Jun 24 Python
用Python爬取某乎手机APP数据
Jun 15 Python
浅析Python实现DFA算法
Jun 26 Python
Python 数据可视化神器Pyecharts绘制图像练习
Feb 28 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
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
php错误级别的设置方法
2013/06/17 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
PHP中preg_match函数正则匹配的字符串长度问题
2015/05/27 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
JS实现购物车特效
2017/02/02 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
vue-star评星组件开发实例
2018/03/01 Javascript
详解vue 不同环境配置不同的打包命令
2019/04/07 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
python使用win32com在百度空间插入html元素示例
2014/02/20 Python
C#返回当前系统所有可用驱动器符号的方法
2015/04/18 Python
Python-OpenCV基本操作方法详解
2018/04/02 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
使用python画社交网络图实例代码
2019/07/10 Python
python logging 日志的级别调整方式
2020/02/21 Python
使用CSS3编写灰阶滤镜来制作黑白照片效果的方法
2016/05/09 HTML / CSS
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
C#基础面试题
2016/10/17 面试题
公司授权委托书范本
2014/04/03 职场文书
会计工作总结范文2014
2014/12/23 职场文书
大学生奖学金获奖感言(范文)
2019/08/15 职场文书
MySQL如何使用使用Xtrabackup进行备份和恢复
2021/06/21 MySQL
windows系统安装配置nginx环境
2022/06/28 Servers