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

2024-04-24 10:30:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个XML文档,我想在它已经包含数据之后更新它。

我考虑过以"a"append)模式打开XML文件。问题是新数据将在根结束标记之后写入。

如何删除文件的最后一行,然后从该点开始写入数据,然后关闭根标记?

当然,我可以读取整个文件并进行一些字符串操作,但我不认为这是最好的主意。。

谢谢你的时间。


Tags: 文件数据字符串文档标记时间模式xml
3条回答

有用的Python XML解析器:

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

其中任何一个都比尝试将XML文件更新为文本字符串要好。

这对你意味着什么:

用您选择的XML解析器打开文件,找到您感兴趣的节点,替换该值,序列化文件。

使用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库将属性存储在dict中,因此,不会保留这些属性在xml文本中列出的顺序。相反,它们将按字母顺序输出。 (同时,删除注释。我觉得这很烦人)

ie:xml输入文本<b y='xxx' x='2'>some body</b>将输出为<b x='2' y='xxx'>some body</b>(在按字母顺序定义顺序参数之后)

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

简单快捷的方法是使用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解析器。这是一个库,允许您使用DOM、树和节点等概念智能地使用XML。这不仅是使用XML的正确方法,也是标准方法,使您的代码更易于移植,也更易于其他程序员理解。

蒂姆的回答提到了为此检查^{},我认为这是个好主意。

相关问题 更多 >