Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中更新/修改XML文件?_Python_Xml_Io - Fatal编程技术网

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

如何在python中更新/修改XML文件?,python,xml,io,Python,Xml,Io,我有一个XML文档,我想在它已经包含数据后更新它 我考虑在“a”(append)模式下打开XML文件。问题是新数据将写入根结束标记之后 如何删除文件的最后一行,然后从该点开始写入数据,然后关闭根标记 当然,我可以读取整个文件并进行一些字符串操作,但我认为这不是最好的主意 谢谢您的时间。您真正想做的是使用XML解析器并使用提供的API附加新元素 然后简单地覆盖文件 最容易使用的可能是如下所示的DOM解析器: 您应该使用特定的XML模块读取XML文件。这样,您就可以在内存中编辑XML文档,并将更改后

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

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

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

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


谢谢您的时间。

您真正想做的是使用XML解析器并使用提供的API附加新元素

然后简单地覆盖文件

最容易使用的可能是如下所示的DOM解析器:


您应该使用特定的XML模块读取XML文件。这样,您就可以在内存中编辑XML文档,并将更改后的XML文档重写到文件中

以下是一个快速开始:


还有很多其他的XML实用程序,哪一个是最好的取决于XML文件的性质以及您希望以何种方式编辑它。

虽然我同意Tim和Oben Sonne的观点,您应该使用XML库,但仍有一些方法可以将其作为简单的字符串对象进行操作

我可能不会尝试对您所描述的内容使用单个文件指针,而是将文件读入内存,编辑它,然后写出它:

inFile = open('file.xml', 'r')
data = inFile.readlines()
inFile.close()
# some manipulation on `data`
outFile = open('file.xml', 'w')
outFile.writelines(data)
outFile.close()

快速简便的方法是使用
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的正确方法,也是标准方法,使您的代码更具可移植性,也更易于其他程序员理解


Tim的回答提到为此目的签出,我认为这是一个好主意。

有用的Python XML解析器:

  • -功能性但有限
  • -性能良好,功能更多
  • -在大多数情况下具有高性能、高功能性,包括真正的xpath支持
  • 其中任何一个都比尝试将XML文件更新为文本字符串要好

    这对你意味着什么:


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

    使这个过程更健壮,你可以考虑使用SAX解析器(这样你就不必把整个文件保存在内存中),读写到树的末尾,然后开始追加。

    使用
    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')
    
    import xml.etree.ElementTree
    #打开原始文件
    et=xml.etree.ElementTree.parse('file.xml')
    #附加新标记:正文文本
    new_tag=xml.etree.ElementTree.SubElement(et.getroot(),'a')
    new_tag.text='body text'
    new_tag.attrib['x']='1'#必须是str;不能是整数
    新标签.attrib['y']='abc'
    #写回文件
    #et.write('file.xml')
    et.write('file_new.xml')
    
    注意:输出写入
    文件\u new.xml
    供您实验,回写
    文件.xml
    将替换旧内容

    要点:ElementTree库将属性存储在dict中,因此,这些属性在xml文本中列出的顺序将不会保留。相反,它们将按字母顺序输出。 (同时,评论也被删除。我觉得这很烦人)

    ie:xml输入文本
    some body
    将作为
    some body
    输出(按字母顺序排列后,定义了顺序参数)


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

    正如Edan Maor所解释的,快速而肮脏的方法(对于[utc-16]编码的.xml文件),对于Edam Maor所解释的原因,您不应该这样做,如果时间限制不允许您学习(propper)XML解析,可以使用以下python 2.7代码完成

    假设您想:

  • 删除原始xml文件中的最后一行
  • 加行
  • 换行
  • 关闭根标记
  • 它在Python2.7中工作,修改了位于文件夹“a”中名为“b.xml”的.xml文件,其中“a”位于python的“工作文件夹”中。它将新修改的文件输出为文件夹“a”中的“c.xml”,在python 2.7之外的进一步使用中不会产生编码错误(对我来说)

    pattern = '<Author>'
    subst = '    <Author>' + domain + '\\' + user_name + '</Author>'
    line_index =0 #set line count to 0 before starting
    file = io.open('a/b.xml', 'r', encoding='utf-16')
    lines = file.readlines()
    outFile = open('a/c.xml', 'w')
    for line in lines[0:len(lines)]:
        line_index =line_index +1
        if line_index == len(lines):
            #1. & 2. delete last line and adding another line in its place not writing it
            outFile.writelines("Write extra line here" + '\n')
            # 4. Close root tag:
            outFile.writelines("</phonebook>") # as in:
            #http://tizag.com/xmlTutorial/xmldocument.php
        else:
            #3. Substitue a line if it finds the following substring in a line:
            pattern = '<Author>'
            subst = '    <Author>' + domain + '\\' + user_name + '</Author>'
            if pattern in line:
                line = subst
                print line
            outFile.writelines(line)#just writing/copying all the lines from the original xml except for the last.
    
    pattern=''
    subst=''+域+'\'+用户名+''
    line_index=0#启动前将line count设置为0
    file=io.open('a/b.xml','r',encoding='utf-16')
    lines=file.readlines()
    outFile=open('a/c.xml','w')
    对于行中的行[0:len(行)]:
    行索引=行索引+1
    如果行_索引==len(行):
    #1. & 2. 删除最后一行并在其位置添加另一行,而不是写入它
    outFile.writelines(“在此处额外写入一行”+'\n')
    # 4. 关闭根标记:
    outFile.writelines(“”)如:
    #http://tizag.com/xmlTutorial/xmldocument.php
    其他:
    #3.如果在一行中发现以下替换字符串,则替换该行:
    模式=“”
    subst=''+域+'\'+用户名+''
    如果模式一致:
    行=子行
    打印行
    outFi
    
    import xml.etree.ElementTree as ET
    
    tree = ET.parse('country_data.xml')
    root = tree.getroot()
    
    for rank in root.iter('rank'):
        new_rank = int(rank.text) + 1
        rank.text = str(new_rank)
        
    tree.write('output.xml')