导读:本期聚焦于甜甜圈创作的《如何在Python中创建XML文档?三种常用方法详解与实例演示》,敬请观看详情。用Python生成XML文档是数据处理和接口开发中经常碰到的需求,比如写配置文件、生成站点地图、给第三方系统推送报文等。本文介绍三种主流实现思路:标准库自带的xml.etree.ElementTree适合大多数场景,代码简洁且无需额外安装;xml.dom.minidom可以输出带缩进的美化格式;配合lxml库则能获得更强的性能和XPath支持。文中通过完整的代码实例演示如何创建元素、设置属性、添加子节点以及写入文件,还讲解了中文乱码、格式化输出等常见问题的解决办法,帮助你快速掌握Python生成XML的核心技巧。

XML作为一种经典的数据交换格式,至今仍在配置管理、接口对接、站点地图生成等领域大量使用。Python标准库对XML的支持相当完善,从简单的元素树构建到复杂的文档对象模型都有覆盖。这篇文章围绕Python创建XML文档这个主题,详细介绍几种常用方式的原理、写法和适用场景,并附上可以直接运行的完整代码,读完之后你可以根据实际项目需求选择最合适的方案。

如何在Python中创建XML文档?三种常用方法详解与实例演示

一、使用xml.etree.ElementTree创建XML

ElementTree是Python官方推荐的XML处理接口,它位于标准库中,无需安装第三方包就能直接使用。它的核心思想是把XML文档抽象成一棵元素树,每个元素由标签名、属性集和文本内容组成。创建XML的过程就是从根元素开始,逐层添加子元素,最后调用write方法写入文件。

下面这段代码演示了如何构建一个包含书籍信息的XML文档:

import xml.etree.ElementTree as ET

# 创建根元素
root = ET.Element("bookstore")

# 添加第一本书
book1 = ET.SubElement(root, "book", {"category": "编程"})
ET.SubElement(book1, "title").text = "Python入门教程"
ET.SubElement(book1, "author").text = "张三"
ET.SubElement(book1, "price").text = "59.00"

# 添加第二本书
book2 = ET.SubElement(root, "book", {"category": "小说"})
ET.SubElement(book2, "title").text = "平凡的世界"
ET.SubElement(book2, "author").text = "李四"
ET.SubElement(book2, "price").text = "45.50"

# 构建树并写入文件
tree = ET.ElementTree(root)
tree.write("books.xml", encoding="utf-8", xml_declaration=True)

代码中ET.SubElement是一个非常实用的函数,它一步完成了创建元素和挂载到父节点两个动作,比先调用ET.Element再手动append要简洁不少。write方法的encoding参数建议显式指定为utf-8,并设置xml_declaration=True,这样生成的文件开头会带上<?xml version='1.0' encoding='utf-8'?>声明,避免其他程序解析时出现编码识别问题。

需要说明的是,旧版本Python(3.9之前)中ElementTree写入的XML是没有任何缩进的,所有内容挤在一行,可读性较差。Python 3.9新增了ET.indent函数专门解决这个问题:

import xml.etree.ElementTree as ET

root = ET.Element("root")
child = ET.SubElement(root, "data")
ET.SubElement(child, "item").text = "测试内容"

# 对整棵树做缩进格式化,空格数为2
ET.indent(root, space="  ")

tree = ET.ElementTree(root)
tree.write("output.xml", encoding="utf-8", xml_declaration=True)

如果你的Python版本低于3.9,可以考虑用字符串拼接的方式手动换行缩进,或者直接使用后面介绍的minidom方案。总体来说,ElementTree的优势在于轻量、快速、接口直观,是绝大多数场景下的首选。

二、使用xml.dom.minidom生成带格式的XML

minidom是Python标准库中另一个XML处理模块,它是文档对象模型(DOM)的轻量级实现。与ElementTree相比,minidom最大的亮点是自带格式化输出能力,调用toprettyxml方法就能生成带缩进和换行的漂亮文档,特别适合需要人工查看或编辑的XML文件。

先看一个纯minidom写法的例子:

from xml.dom import minidom

# 创建DOM文档对象
doc = minidom.Document()

# 创建根元素并添加到文档
root = doc.createElement("students")
doc.appendChild(root)

# 创建学生节点
student = doc.createElement("student")
student.setAttribute("id", "1001")

name = doc.createElement("name")
name.appendChild(doc.createTextNode("王五"))
student.appendChild(name)

age = doc.createElement("age")
age.appendChild(doc.createTextNode("20"))
student.appendChild(age)

root.appendChild(student)

# 格式化输出到文件
with open("students.xml", "w", encoding="utf-8") as f:
    f.write(doc.toprettyxml(indent="  ", encoding=None))

这种写法遵循标准DOM操作习惯,先通过createElement创建节点,再用appendChild建立层级关系,文本内容需要通过createTextNode生成文本节点后挂载上去。步骤虽然多一些,但逻辑非常清晰,有过其他语言DOM编程经验的人会觉得眼熟。

minidom还有一个常见用法:与ElementTree结合,先用ElementTree构建树,再借助minidom做美化输出。这种组合在Python 3.9之前的版本中很流行:

import xml.etree.ElementTree as ET
from xml.dom import minidom

root = ET.Element("config")
ET.SubElement(root, "host").text = "192.168.0.1"
ET.SubElement(root, "port").text = "8080"

# 转成字符串后交给minidom格式化
rough = ET.tostring(root, encoding="unicode")
parsed = minidom.parseString(rough)

print(parsed.toprettyxml(indent="  "))

注意toprettyxml有一个小坑:如果encoding参数传了具体编码如utf-8,它会返回bytes类型;传None则返回字符串。示例中的192.168.0.1这类地址在输出时会原样保留,不会受到格式化影响。另外minidom的内存开销比ElementTree大,处理超大文档时性能一般,日常生成中小型配置文件完全够用。

三、使用lxml库处理复杂XML需求

lxml是第三方库中最流行的XML方案,底层基于C语言实现的libxml2,性能远超标准库,同时完整支持XPath、XSLT、DTD校验等高级特性。如果项目里需要频繁处理大量XML数据,或者要生成后立即做校验和查询,lxml是值得引入的选择。安装方式很简单,执行pip install lxml即可。

lxml的编程接口与ElementTree高度兼容,掌握前者后几乎可以无缝切换:

from lxml import etree

# 创建根元素,注意lxml的根元素由Element函数创建
root = etree.Element("sitemap")

url = etree.SubElement(root, "url")
etree.SubElement(url, "loc").text = "https://www.ipipp.com/page1"
etree.SubElement(url, "priority").text = "0.8"

url2 = etree.SubElement(root, "url")
etree.SubElement(url2, "loc").text = "https://www.ipipp.com/page2"
etree.SubElement(url2, "priority").text = "0.6"

# 美化输出并写入文件
xml_bytes = etree.tostring(root, pretty_print=True,
                           xml_declaration=True, encoding="utf-8")
with open("sitemap.xml", "wb") as f:
    f.write(xml_bytes)

# 使用XPath查询验证结果
locs = root.xpath("//loc/text()")
print(locs)

这段代码展示了lxml的几个亮点:pretty_print=True一行搞定格式化,无需版本顾虑;xpath方法可以直接在内存中的树上执行查询,生成后马上校验数据是否正确,这一点在自动化生成站点地图、报文文件时特别有用。

三种方案的选型可以简单归纳:只生成简单XML且环境允许用Python 3.9以上,直接用ElementTree加indent函数;必须兼容旧版本又想要格式化输出,用ElementTree配合minidom;追求性能、需要XPath或校验能力,上lxml。

四、常见问题与注意事项

中文乱码问题是最常被问到的一个。只要写入文件时统一使用utf-8编码,并且XML声明中声明的编码与实际编码一致,中文内容就不会乱码。反例是用默认的open函数不指定encoding,在Windows下会按GBK写入,与声明的utf-8冲突。所以推荐像上面例子那样,要么给write方法传encoding参数,要么给open传encoding="utf-8"

特殊字符转义是另一个容易踩坑的点。当文本内容中出现<、>、&这类字符时,序列化库会自动转义成实体引用,读取方解析时会自动还原,这不需要我们手动处理。但如果属性值里包含引号,要注意序列化后可能不符合预期,必要时先把双引号换成单引号或做实体替换。此外,标签名和属性名必须符合XML命名规范,不能以数字开头,不能包含空格。

最后提醒一下,如果生成XML只是为了存储结构化数据供自己程序读取,不妨评估一下JSON是否更合适,JSON解析更快、可读性也不错。XML的真正优势在于跨系统、跨语言的数据交换以及那些强制要求XML格式的场景,比如站点地图、老式Web Service接口等。选对工具,比把工具用熟更重要。

Python创建XMLxml.etree.ElementTreeminidom修改时间:2026-09-15 17:04:45

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260915/57394.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。