我有一个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解析器:
任何这些都比尝试将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为此目的检查,我认为这是一个好主意.