如何使用lxml更新XML文件

use*_*786 8 python xml lxml

我想使用lxml库更新包含新信息的xml文件.例如,我有这个代码:

>>> from lxml import etree
>>>
>>> tree = etree.parse('books.xml')
Run Code Online (Sandbox Code Playgroud)

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

我的问题是,如何treenew_entry树更新元素树并保存文件.

Gui*_*ume 9

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

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', 'w')
f.write(etree.tostring(root, pretty_print=True))
f.close()
Run Code Online (Sandbox Code Playgroud)

  • 这段代码的最后一部分对我不起作用。`etree.tostring()` 返回 `bytes`,因此 `f.write()` 抛出以下异常:`TypeError, write() 参数必须是 str,而不是 bytes`。我建议将 `bytes` 转换为 `string`,在 `etree.tostring(root, pretty_print=True)` 末尾添加 `.decode("utf-8")`,或者使用 `ElementTree.write() ` 方法以这种方式`tree.write("new/file/path")`。虽然第一个片段更新了现有文件,而第二个片段创建了一个新文件,但两者都可以用于此问题的目的。 (2认同)