Python ElementTree 生成 XML 并解决头部声明缺失问题
本文介绍如何使用Python的ElementTree库构建XML树,并重点解决etree.tostring()方法输出缺少XML头部声明的问题。通过对比tree.write()与tostring()的差异,提供了使用minidom解析或设置write参数xml_declaration=True两种解决方案,确保生成的XML文件包含标准的版本声明。
ElementTree简介与导入
在Python中处理XML文档有多种方式,除了传统的SAX和DOM解析器外,ElementTree也是一个常用且高效的工具。
使用前需要导入相应的模块:
from xml.etree import ElementTree as etree
构建XML树结构
接下来开始构建XML树结构:
from xml.etree.ElementTree import Element, SubElement, ElementTree
# 生成根节点
root = Element('root')
# 生成第一个子节点 head
head = SubElement(root, 'head')
# head 节点的子节点
title = SubElement(head, 'title')
title.text = 'Well Dola!'
# 生成 root 的第二个子节点 body
body = SubElement(root, 'body')
# body 的内容
body.text = 'I love Dola!'
tree = ElementTree(root)
通过上述代码,我们获得了代表XML树的tree对象以及其根节点root对象。
XML字符串转换及头部缺失问题
随后,将树结构转换为XML字符串主要有两种途径:一是利用tree对象的write方法将内容写入文件,二是使用etree的tostring方法直接转换为XML字符串。
# 第一种
tree.write('result.xml', encoding='utf-8')
# 第二种
xml_string = etree.tostring(root)
# xml_string 就是 xml 字符串了
然而,第二种方法存在一个常见问题,即输出结果中不包含
<?xml version="1.0"?>
这一标准的头部定义信息。例如,直接转换可能得到如下字符串:
'<root><head><title>Well Dola!</title></head><body>I love Dola!</body></root>'
面对这种情况,该如何处理?
使用minidom解决头部声明缺失
一种可行的解决方案是利用minidom模块来实现,具体步骤如下:
from xml.dom import minidom
# 使用 minidom 解析
tree = minidom.parseString(xml_string)
# 重新生成 xml 字符串
xml_string = tree.toxml()
尽管这种方法增加了额外的代码执行开销,但它能有效解决头部声明缺失的问题。
最终生成的XML代码如下所示:
u'<?xml version="1.0" ?><root><head><title>Well Dola!</title></head><body>I love Dola!</body></root>'
此外,还可以利用minidom中tree对象的toprettyxml方法,对生成的XML进行格式化排版,使其更易读。
write方法中启用xml_declaration参数
补充知识:Python ElementTree导出XML时缺少开头声明的处理
在使用ElementTree修改XML后写入文件时,可能会发现文件开头缺少了<?xml version='1.0' encoding='utf-8'?>声明。
解决方法如下:
在调用ElementTree的write方法写入XML时,需要在参数中增加encoding='utf-8'以及xml_declaration=True。
et_root.write('file.xml', encoding='utf-8', xml_declaration=True)
以上关于利用Python ElementTree生成XML的实例分享完毕,希望能为读者提供参考,欢迎支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









