0

0

如何在Python中创建XML文档?

月夜之吻

月夜之吻

发布时间:2025-09-04 12:09:07

|

707人浏览过

|

来源于php中文网

原创

使用xml.etree.ElementTree创建XML的核心步骤包括:导入模块、创建根元素、添加子元素与属性、设置文本内容、生成ElementTree对象并写入文件;注意事项有:使用ET.indent()提升可读性、指定encoding="utf-8"和xml_declaration=True保证编码规范、通过try-except处理文件写入异常;此外,lxml库功能更强,支持XPath和XSD验证,适合复杂场景。

如何在python中创建xml文档?

在Python中创建XML文档,最常用且内置的方法是利用

xml.etree.ElementTree
模块。它提供了一个直观的API来构建XML树结构,让你能像搭积木一样,将元素、属性和文本内容组织起来,最终形成一个符合XML规范的文档。对于更复杂的场景或性能要求,
lxml
库也是一个非常强大的选择。

解决方案

使用

xml.etree.ElementTree
模块来创建XML文档,这通常涉及以下几个核心步骤:首先是导入模块,接着创建根元素,然后逐步添加子元素、属性和文本内容,最后将整个XML树写入文件。

让我们以创建一个简单的“书籍列表”XML文档为例:

import xml.etree.ElementTree as ET

def create_book_list_xml():
    # 1. 创建根元素
    # 比如,我们想要一个名为 <bookstore> 的根元素
    root = ET.Element("bookstore")

    # 2. 添加第一个 <book> 元素
    book1 = ET.SubElement(root, "book", category="fiction") # category 是属性
    title1 = ET.SubElement(book1, "title")
    title1.text = "The Great Python Adventure"
    author1 = ET.SubElement(book1, "author")
    author1.text = "Jane Doe"
    year1 = ET.SubElement(book1, "year")
    year1.text = "2023"
    price1 = ET.SubElement(book1, "price")
    price1.text = "29.99"

    # 3. 添加第二个 <book> 元素
    book2 = ET.SubElement(root, "book", category="programming")
    title2 = ET.SubElement(book2, "title")
    title2.text = "Mastering XML with Python"
    author2 = ET.SubElement(book2, "author")
    author2.text = "John Smith"
    year2 = ET.SubElement(book2, "year")
    year2.text = "2022"
    price2 = ET.SubElement(book2, "price")
    price2.text = "39.50"

    # 4. 创建一个ElementTree对象
    tree = ET.ElementTree(root)

    # 5. 将XML树写入文件
    # 我们可以通过 ET.indent() 来格式化输出,使其更具可读性
    ET.indent(tree, space="\t", level=0) # 使用制表符进行缩进

    try:
        tree.write("bookstore.xml", encoding="utf-8", xml_declaration=True)
        print("XML文档 'bookstore.xml' 已成功创建。")
    except IOError as e:
        print(f"写入文件时发生错误: {e}")

# 调用函数来创建XML文件
if __name__ == "__main__":
    create_book_list_xml()

运行这段代码后,你会在当前目录下得到一个名为

bookstore.xml
的文件,其内容大致如下:

立即学习Python免费学习笔记(深入)”;

<?xml version='1.0' encoding='utf-8'?>
<bookstore>
    <book category="fiction">
        <title>The Great Python Adventure</title>
        <author>Jane Doe</author>
        <year>2023</year>
        <price>29.99</price>
    </book>
    <book category="programming">
        <title>Mastering XML with Python</title>
        <author>John Smith</author>
        <year>2022</year>
        <price>39.50</price>
    </book>
</bookstore>

使用
xml.etree.ElementTree
创建XML文档有哪些核心步骤和注意事项?

当我们谈论用

ElementTree
来构建XML,最核心的无非就是对“元素”这个概念的理解和操作。你可以把它想象成一个层层嵌套的盒子。

首先,你需要一个最外层的“大盒子”,也就是根元素。这通过

ET.Element("根元素名")
来创建。一旦有了根,接下来的所有内容都将是它的子孙。

然后,就是往这些盒子里装更小的盒子,或者直接放东西。添加子元素,我们用

ET.SubElement(父元素, "子元素名", 属性字典)
。这里的属性字典是可选的,如果你想给元素加些元数据,比如
<book category="fiction">
category
就是属性。我个人觉得这种方式非常直观,因为它直接映射了XML的层级结构。

元素的文本内容,也就是标签之间的文字,比如

<title>Python</title>
中的
Python
,是通过设置元素的
.text
属性来完成的。如果子元素本身还有文本,那它就不能再有
.text
了,这是XML的规定,但
ElementTree
会帮你处理好这些细节,你只需关心你想要什么。

一个经常被忽略但又非常重要的点是编码。XML文件最终是要被机器或人阅读的,所以正确的编码至关重要。通常,我们都会选择

utf-8
,因为它支持几乎所有字符。在
tree.write()
方法中,通过
encoding="utf-8"
参数来指定。同时,
xml_declaration=True
会确保在文件顶部生成
<?xml version='1.0' encoding='utf-8'?>
这样的声明,这对于XML解析器来说是个好习惯,避免一些不必要的麻烦。

至于可读性,原始的

ElementTree
写入的XML可能都是挤在一行里的,这对于调试和人工阅读来说简直是灾难。幸好,Python 3.9及以上版本提供了
ET.indent(tree)
函数,能很方便地为你的XML添加缩进,让它看起来整洁有序。如果你的Python版本较低,可能需要自己写一个简单的递归函数来遍历并添加换行和空格,但这无疑增加了些许复杂性。我个人是强烈推荐使用
ET.indent()
的,它能让你的XML文件瞬间变得“友好”起来。

Tome
Tome

先进的AI智能PPT制作工具

下载

最后,别忘了错误处理。文件操作总是有可能失败的,比如磁盘空间不足、权限问题等等。用

try...except IOError
来包裹
tree.write()
是一个好习惯,至少能让你的程序在遇到问题时,不是直接崩溃,而是给出一个有意义的提示。

除了
ElementTree
,Python还有哪些库可以用于XML文档的生成,它们各有什么特点?

当然,

ElementTree
是Python标准库的成员,它的优势在于无需额外安装,开箱即用,对于大多数日常的XML操作已经足够了。但Python的XML生态远不止于此,还有一些其他的库,各有侧重。

一个值得一提的是

xml.dom.minidom
。这个模块是Python对W3C DOM(Document Object Model)规范的一个轻量级实现。如果你之前有其他语言(比如JavaScript)操作DOM的经验,那么
minidom
的API会让你感到非常熟悉。它的特点是面向对象,提供了更细粒度的控制,你可以像操作一个JavaScript的DOM树一样,创建节点、文本节点、属性节点,然后将它们逐个“appendChild”到父节点上。相比
ElementTree
的简洁,
minidom
会显得有些冗长,代码量通常会更多。但它在处理一些XML特性,比如命名空间(namespaces)或需要精确控制节点类型时,可能会提供更直接的途径。我通常在需要严格遵循DOM规范或者对XML结构有非常精细控制需求时才会考虑它。

另一个重量级选手是

lxml
。这并不是Python标准库的一部分,你需要通过
pip install lxml
来安装。但一旦你用了它,你可能就不想回到
ElementTree
了。
lxml
是一个非常强大、快速且功能丰富的库,它是基于C语言的libxml2和libxslt库构建的,因此在性能上通常优于纯Python实现的
ElementTree
minidom
。它的API设计吸收了
ElementTree
的优点,同时又扩展了许多高级功能,比如XPath、XSLT支持,以及更健壮的错误处理。当你需要处理大型XML文件、进行复杂的查询、或者对性能有较高要求时,
lxml
无疑是首选。它的学习曲线可能比
ElementTree
略陡峭,但投入是值得的,尤其是在企业级应用或数据密集型项目中。对我来说,如果项目允许安装第三方库,
lxml
几乎是我的默认选择,它在功能和性能之间找到了一个很好的平衡点。

简单来说:

  • xml.etree.ElementTree
    : 标准库,简单易用,适合大多数基本XML创建任务。
  • xml.dom.minidom
    : 标准库,遵循DOM规范,提供细粒度控制,但代码较冗长。
  • lxml
    : 第三方库,性能卓越,功能强大(XPath, XSLT等),适合处理大型或复杂XML,以及对性能有要求的场景。

在生成复杂XML结构时,如何确保文档的有效性和可读性?

生成复杂XML结构,特别是那些需要与外部系统交互的XML,确保其有效性可读性是至关重要的。这不仅仅是编码规范的问题,更是保证数据交换顺畅的关键。

关于有效性,最权威的验证方式是使用XML Schema (XSD)DTD (Document Type Definition)。这些是定义XML文档结构、数据类型和约束的语言。一个XML文档只有在符合其声明的Schema或DTD时,才被称为“有效”的。Python标准库本身并没有内置的XSD验证器,但

lxml
库在这方面表现出色。你可以用
lxml
加载一个XSD文件,然后用它来验证你生成的XML文档。这就像给你的XML文件提供了一份“设计图”,确保它严格按照预期格式构建。我个人觉得,对于任何需要跨系统传输的XML,特别是涉及金融、医疗等敏感数据的,Schema验证是不可或缺的一步。在开发阶段,即使不严格执行运行时验证,也应该在设计阶段就明确Schema,并以此指导XML的生成逻辑。

除了Schema验证,确保良好格式 (Well-formedness) 也是基本要求。这意味着XML必须有且只有一个根元素,所有标签都必须正确关闭,属性值必须用引号包裹等等。幸运的是,

ElementTree
lxml
这类库在生成XML时,会自动处理大部分良好格式的问题,比如字符转义(如
&
转换为
&
),这省去了我们很多手动检查的麻烦。

至于可读性,这主要关乎代码和生成出的XML文件本身。

  1. 缩进和换行:前面提到的
    ET.indent()
    (或
    lxml
    pretty_print=True
    )是让XML文件看起来整洁的关键。没有缩进的XML就像一堵密不透风的文字墙,让人望而却步。
  2. 命名规范:在Python代码中,为XML元素和属性选择清晰、一致的命名,这不仅提升了代码的可读性,也使得生成的XML文档更容易被理解。例如,不要一会儿用
    book_title
    ,一会儿又用
    BookTitle
  3. 模块化代码:当XML结构变得复杂时,将XML生成逻辑分解成更小的、职责单一的函数或类。例如,一个函数负责生成
    <book>
    元素,另一个负责生成
    <author>
    元素。这样可以减少代码重复,提高可维护性,并且更容易定位和修复生成错误。
  4. 注释(在代码中):在生成XML的代码中添加注释,解释为什么某些元素或属性以特定方式构建,或者它们代表什么业务含义。虽然XML文档本身也可以包含注释(
    ET.Comment()
    ),但在大多数情况下,代码中的注释对维护者来说更有价值。

在我的实践中,我发现一个常见的挑战是,当需求变化时,XML结构也需要随之调整。如果一开始的代码结构混乱,那么修改起来会非常痛苦。所以,投入一些时间去设计清晰的XML结构和模块化的生成代码,这绝对是一项值得的投资。有时,为了满足特定的外部系统要求,我们甚至需要生成一些“不那么完美”的XML,比如某些元素顺序必须固定,或者某些空元素不能省略。这时候,对XML生成库的深入理解和灵活运用就显得尤为重要了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

410

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

638

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

362

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

263

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

630

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

670

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

618

2023.09.22

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号