《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 '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>'
>>>

如果想为元素附加上属性,可以使用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节中对有序字典的介绍。

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('<{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文档。得到的Element实例也能够以各种方式进行处理,完全不必担心解析XML文本方面的问题。最重要的是,我们能够站在更高的层面上对数据进行各种处理,只在最后把结果作为字符串输出即可。

相关文章
|
5月前
|
XML 存储 Java
Python-docx编号列表解析:从XML迷宫到结构化数据的破局之道
本文深入解析了Word文档中自动编号的存储机制及解析难题,探讨了其在技术处理中的障碍,并通过三种实战方案对比,帮助开发者高效提取结构化数据。内容涵盖底层XML结构、常见问题解决方案及性能优化技巧,适用于合同条款、文档自动化处理等场景。
405 0
|
5月前
|
XML 存储 缓存
Python-docx编号列表解析:从XML迷宫到结构化数据的破局之道
Word文档中的自动编号功能虽便捷,却在技术处理时常成为障碍。本文深入解析Word文档的XML结构,揭示编号信息的存储机制,并提供多种基于Python的解决方案,涵盖跨平台解析、性能优化及固定模板处理,助力开发者突破编号解析难题,实现合同条款等内容的结构化提取与处理。
249 0
|
Python Windows
Python基础教程(第3版)中文版 第18章 程序打包 (笔记)
Python基础教程(第3版)中文版 第18章 程序打包 (笔记)
150 0
|
XML JSON API
如何使用Python将字典转换为XML
本文介绍了如何使用Python中的`xml.etree.ElementTree`库将字典数据结构转换为XML格式。通过定义递归函数处理字典到XML元素的转换,生成符合标准的XML文档,适用于与旧系统交互或需支持复杂文档结构的场景。示例代码展示了将一个简单字典转换为XML的具体实现过程。
244 1
|
存储 Python
Python:利用XML-RPC实现简单的远端过程调用
Python:利用XML-RPC实现简单的远端过程调用
92 1
|
XML 数据格式 Python
python 解析xml遇到xml.etree.ElementTree.ParseError: not well-formed (invalid token): |4-8
python 解析xml遇到xml.etree.ElementTree.ParseError: not well-formed (invalid token): |4-8
|
XML JavaScript API
30天拿下Python之使用xml
30天拿下Python之使用xml
96 0
|
XML 数据格式 Python
【Python】已解决:xml.parsers.expat.ExpatError: no element found: Line 1, column 0
【Python】已解决:xml.parsers.expat.ExpatError: no element found: Line 1, column 0
620 0
|
XML JavaScript 数据格式
【Python】已解决:(Python xml库 import xml.dom.minidom导包报错)‘No module named dom’
【Python】已解决:(Python xml库 import xml.dom.minidom导包报错)‘No module named dom’
343 0
|
XML 数据格式 Python
【Python】已解决:FileNotFoundError: [Errno 2] No such file or directory: ‘./1.xml’
【Python】已解决:FileNotFoundError: [Errno 2] No such file or directory: ‘./1.xml’
837 0

热门文章

最新文章

推荐镜像

更多