我有一个如下所示的xml:
<books>
<book>
<title>MyBook1</title>
<content>any content</content>
</book>
<book>
<title>MyBook2</title>
<content>any content 2</content>
</book>
<book>
<title>MyBook3</title>
<content>any content 3</content>
</book>
如果我知道书名,最简单的方法是更改任何书的内容?
目前,我使用etree遍历所有书籍,将书名与要更改的书名进行比较。如果我找到了它,我会更改内容。 但是我觉得应该有一种更简便的方法,而无需遍历所有书来查找一本书。
答案 0 :(得分:0)
“最简单”的方法有点主观,但我的首选方法是使用XPath。
ElementTree具有limited XPath support,但看起来足以满足您的需求。
如果最终需要使用更复杂的XPath,建议您使用XPath in lxml。
这是使用ElementTree的示例...
XML输入(input.xml)
<books>
<book>
<title>MyBook1</title>
<content>any content</content>
</book>
<book>
<title>MyBook2</title>
<content>any content 2</content>
</book>
<book>
<title>MyBook3</title>
<content>any content 3</content>
</book>
</books>
Python
import xml.etree.ElementTree as ET
tree = ET.parse("input.xml")
tree.find("book[title='MyBook2']/content").text = "*** New Content ***"
ET.dump(tree.getroot())
输出(转储到控制台)
<books>
<book>
<title>MyBook1</title>
<content>any content</content>
</book>
<book>
<title>MyBook2</title>
<content>*** New Content ***</content>
</book>
<book>
<title>MyBook3</title>
<content>any content 3</content>
</book>
</books>
这是使用lxml的版本(相同的输入=相同的输出)...
from lxml import etree
tree = etree.parse("input.xml")
tree.xpath("book[title='MyBook2']/content")[0].text = "*** New Content ***"
etree.dump(tree.getroot())