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

nun*_*nos 26 python xml io

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

我考虑过在"a"(追加)模式下打开XML文件.问题是新数据将在根关闭标记之后写入.

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

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

谢谢你的时间.

Fra*_*fin 65

使用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')
Run Code Online (Sandbox Code Playgroud)

注意:输出写给file_new.xml你进行实验,写回来file.xml会替换旧内容.

重要信息:ElementTree库将属性存储在dict中,因此,不会保留xml文本中列出这些属性的顺序.相反,它们将按字母顺序输出.(同样,评论被删除.我发现这很烦人)

即:xml输入文本<b y='xxx' x='2'>some body</b>将输出为<b x='2' y='xxx'>some body</b>(在定义订单参数字母后)

这意味着在将原始文件和更改的文件提交到版本控制系统(例如SVN,CSV,ClearCase等)时,2个文件之间的差异可能看起来不太漂亮.


Gab*_*ley 24

有用的Python XML解析器:

  1. Minidom - 功能齐全但有限
  2. ElementTree - 体面的性能,更多的功能
  3. lxml - 大多数情况下的高性能,高功能,包括真正的xpath支持

任何这些都比尝试将XML文件更新为文本字符串更好.

这对你意味着什么:

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


Eda*_*aor 10

你绝对不应该做的快速简便的方法(见下文)是将整个文件读入一个字符串列表中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)
Run Code Online (Sandbox Code Playgroud)

你不应该这样做的原因是,除非你正在做一些非常快速的事情,否则你应该使用XML解析器.这是一个库,允许您使用DOM,树和节点等概念智能地处理XML.这不仅是使用XML的正确方法,它也是标准方法,使您的代码更易于移植,并且更容易让其他程序员理解.

蒂姆的回答提到xml.dom.minidom为此目的检查,我认为这是一个好主意.

  • 在不使用其中一个解析器的情况下编辑XML是一个巨大的代码味道.我不得不解决其他人发布这样做的软件,这是一个糟糕的问题.如果它是XML,那么XML具有应该遵守的某些属性 - 比如能够使用空格 - 移动标记但保持XML的相同语义,或者添加XML注释.由此产生的程序变得脆弱,可能首先失败.不要这样做! (9认同)