如何在Python中更新/修改XML文件?

54 投票
9 回答
174570 浏览
提问于 2025-04-15 15:11

我有一个XML文档,想在里面更新一些数据,但这个文档已经有内容了。

我考虑过用 "a"(追加)模式打开这个XML文件。问题是,新数据会被写在根标签的结束标记之后。

我该怎么做才能删除文件的最后一行,然后从那个地方开始写数据,最后再关闭根标签呢?

当然,我可以读取整个文件,然后进行一些字符串操作,但我觉得这不是最好的办法……

9 个回答

32

有用的Python XML解析器:

  1. Minidom - 功能齐全但有点限制
  2. ElementTree - 性能不错,功能更多
  3. lxml - 在大多数情况下性能很高,功能强大,包括真正的xpath支持

用这些工具处理XML文件要比直接把它当成文本字符串来更新要好得多。

这对你意味着什么:

用你选择的XML解析器打开文件,找到你感兴趣的节点,替换掉它的值,然后把文件保存回去。

101

使用 ElementTree

import xml.etree.ElementTree

# Open original file
et = xml.etree.ElementTree.parse('file.xml')

# Append new tag: <a x='1' y='abc'>body text</a>
new_tag = xml.etree.ElementTree.SubElement(et.getroot(), 'a')
new_tag.text = 'body text'
new_tag.attrib['x'] = '1' # must be str; cannot be an int
new_tag.attrib['y'] = 'abc'

# Write back to file
#et.write('file.xml')
et.write('file_new.xml')

注意:输出会写入 file_new.xml,你可以用它来实验,写回 file.xml 会替换掉旧的内容。

重要提示:ElementTree 库把属性存储在一个字典里,因此这些属性在 XML 文本中出现的顺序不会被保留。相反,它们会按照字母顺序输出。

另外,注释会被删除,这让我觉得挺烦的。

比如:输入的 XML 文本 <b y='xxx' x='2'>some body</b> 会被输出为 <b x='2' y='xxx'>some body</b>(在按字母顺序排列后,参数的顺序就变了)。

这意味着,当你把原始文件和修改后的文件提交到版本控制系统(比如 SVN、CSV、ClearCase 等)时,这两个文件之间的差异可能看起来不太好。

12

有一种快速简单的方法,你绝对不应该这样做(见下文),就是用 readlines() 把整个文件读进一个字符串列表。我写这段话是为了防止你寻找这种快速简单的解决方案。

你只需要用 open() 打开文件,然后调用 readlines() 方法。这样你就能得到文件中所有字符串的列表。接着,你可以很方便地在最后一个元素之前添加字符串(只需在列表中倒数第二个位置添加)。最后,你可以用 writelines() 把这些内容写回文件。

下面是一个例子,可能会对你有帮助:

my_file = open(filename, "r")
lines_of_file = my_file.readlines()
lines_of_file.insert(-1, "This line is added one before the last line")
my_file.writelines(lines_of_file)

你不应该这样做的原因是,除非你只是想快速搞定一些事情,否则你应该使用 XML 解析器。这是一个库,可以让你更智能地处理 XML,使用像 DOM、树和节点这样的概念。这不仅是处理 XML 的正确方法,也是标准做法,这样你的代码更容易移植,也更容易让其他程序员理解。

Tim 的回答提到可以查看 xml.dom.minidom,我觉得这是个不错的主意。

撰写回答