【问题标题】:How to update XML file with lxml如何使用 lxml 更新 XML 文件
【发布时间】:2013-06-21 22:37:12
【问题描述】:

我想通过使用 lxml 库来用新信息更新 xml 文件。 例如,我有这样的代码:

>>> from lxml import etree
>>>
>>> tree = etree.parse('books.xml')

其中'books.xml'文件,有这个内容:http://www.w3schools.com/dom/books.xml

我想用新书更新这个文件:

>>> new_entry = etree.fromstring('''<book category="web" cover="paperback">
... <title lang="en">Learning XML 2</title>
... <author>Erik Ray</author>
... <year>2006</year>
... <price>49.95</price>
... </book>''')

我的问题是,如何使用new_entry 树更新tree 元素树并保存文件。

【问题讨论】:

    标签: python xml lxml


    【解决方案1】:

    在这里,获取树的根,添加新元素,将树作为字符串保存到文件中:

    from lxml import etree
    
    tree = etree.parse('books.xml')
    
    new_entry = etree.fromstring('''<book category="web" cover="paperback">
    <title lang="en">Learning XML 2</title>
    <author>Erik Ray</author>
    <year>2006</year>
    <price>49.95</price>
    </book>''')
    
    root = tree.getroot()
    
    root.append(new_entry)
    
    f = open('books-mod.xml', 'wb')
    f.write(etree.tostring(root, pretty_print=True))
    f.close()
    

    【讨论】:

    • pretty_print=True 不适用于附加节点。
    • 这段代码的最后一部分对我不起作用。 etree.tostring() 返回bytes,所以f.write() 抛出以下异常:TypeError, write() argument must be str, not bytes。我建议要么将bytes 转换为string,在etree.tostring(root, pretty_print=True) 的末尾添加.decode("utf-8"),或者以这种方式使用ElementTree.write() 方法tree.write("new/file/path")。虽然第一个 sn -p 更新现有文件,而第二个创建一个新文件,但两者都可以用于这个问题。
    • 使代码工作的最简单的更改是将 f = open('books-mod.xml', 'w') 行更改为 f = open('books-mod.xml', 'wb')
    • @Salvatore:你可以使用etree.tostring(root, pretty_print=True, encoding=str)
    【解决方案2】:

    我没有足够的声誉来发表评论,因此我会写一个答案......

    让Guillaume的代码工作的最简单的改变就是改变行

    f = open('books-mod.xml', 'w')
    

    f = open('books-mod.xml', 'wb')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 2018-04-06
      • 1970-01-01
      • 2018-07-24
      • 2014-05-31
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多