Python:通过值查找xml标签并更改另一个标签的最简单方法是什么

时间:2019-04-23 08:42:38

标签: xml python-2.7

我有一个如下所示的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遍历所有书籍,将书名与要更改的书名进行比较。如果我找到了它,我会更改内容。 但是我觉得应该有一种更简便的方法,而无需遍历所有书来查找一本书。

1 个答案:

答案 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())