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. 创建根元素
    # 比如,我们想要一个名为  的根元素
    root = ET.Element("bookstore")

    # 2. 添加第一个  元素
    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. 添加第二个  元素
    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免费学习笔记(深入)”;



    
        The Great Python Adventure
        Jane Doe
        2023
        29.99
    
    
        Mastering XML with Python
        John Smith
        2022
        39.50
    

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

当我们谈论用

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

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

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

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

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

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

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

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

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

至于可读性,原始的

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

j2me3D游戏开发简单教程 中文WORD版
j2me3D游戏开发简单教程 中文WORD版

本文档主要讲述的是j2me3D游戏开发简单教程; 如今,3D图形几乎是任何一部游戏的关键部分,甚至一些应用程序也通过用3D形式来描述信息而获得了成功。如前文中所述,以立即模式和手工编码建立所有的3D对象的方式进行开发速度很慢且很复杂。应用程序中多边形的所有角点必须在数组中独立编码。在JSR 184中,这称为立即模式。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

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

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生成逻辑分解成更小的、职责单一的函数或类。例如,一个函数负责生成
    元素,另一个负责生成
    元素。这样可以减少代码重复,提高可维护性,并且更容易定位和修复生成错误。
  4. 注释(在代码中):在生成XML的代码中添加注释,解释为什么某些元素或属性以特定方式构建,或者它们代表什么业务含义。虽然XML文档本身也可以包含注释(
    ET.Comment()
    ),但在大多数情况下,代码中的注释对维护者来说更有价值。

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

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

765

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

640

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

619

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1285

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

709

2023.08.11

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

0

2026.01.20

热门下载

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

精品课程

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

共58课时 | 3.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

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

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