python xml转字典_《Python Cookbook(第3版)中文版》——6.5 将字典转换为XML-阿里云开发者社区...

本节书摘来自异步社区《Python Cookbook(第3版)中文版》一书中的第6章,第6.5节,作者[美]David Beazley , Brian K.Jones,陈舸 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

6.5 将字典转换为XML

6.5.1 问题

我们想将Python字典中的数据转换为XML。

6.5.2 解决方案

尽管xml.etree.ElementTree库通常用来解析XML文档,但它同样也可以用来创建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实例。对于I/O操作来说,可以利用xml.etree.ElementTree中的tostring()函数将其转换为字节串。示例如下:

>>> from xml.etree.ElementTree import tostring

>>> tostring(e)

b'490.1100GOOG'

>>>

如果想为元素附加上属性,可以使用set()方法实现:

>>> e.set('_id','1234')

>>> tostring(e)

b'490.1100GOOG

'

>>>

如果需要考虑元素间的顺序,可以创建OrderedDict(有序字典)来取代普通的字典。参见1.7节中对有序字典的介绍。

6.5.3 讨论

当创建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('{1}{0}>'.format(key,val))

parts.append('{}>'.format(tag))

return ''.join(parts)

问题在于如果尝试手工处理的话,那么这就是在自找麻烦。比如,如果字典中包含有特殊字符时会发生什么?

>>> d = { 'name' : '' }

>>> # String creation

>>> dict_to_xml_str('item',d)

''

>>> # Proper XML creation

>>> e = dict_to_xml('item',d)

>>> tostring(e)

b''

>>>

请注意在上面这个示例中,字符分别被取代了。

下面的提示仅供参考。如果需要手工对这些字符做转义处理,可以使用xml.sax.saxutils中的escape()和unescape()函数。示例如下:

>>> from xml.sax.saxutils import escape, unescape

>>> escape('')

''

>>> unescape(_)

''

>>>

为什么说创建Element实例要比使用字符串好?除了可以产生出正确的输出外,其他的原因在于这样可以更加方便地将Element实例组合在一起,创建出更大的XML文档。得到的Element实例也能够以各种方式进行处理,完全不必担心解析XML文本方面的问题。最重要的是,我们能够站在更高的层面上对数据进行各种处理,只在最后把结果作为字符串输出即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值