2

我在我的应用程序中使用 lxml 作为 XML 解析的解决方案。

我知道 lxml 只能替换父级的直接子级,但不能使用.replace替换该子级下的级别

示例 XML:

<root>

    <dc>

        <batman alias='dark_knight' />

    </dc>

</root>

我在这样的字符串中有一个修改过的标签

<batman alias='not_dark_knight' />

我需要一些帮助来使用 xpath '/root/dc/batman' 替换原始 XML。

from lxml import etree

original_xml = "<root><dc><batman alias='dark_knight' /></dc></root>"
modified_tag = "<batman alias='not_dark_knight' />"
x_path = '/root/dc/batman'
original_obj = etree.fromstring(original_xml)
modified_obj = etree.fromstring(modified_tag)

original_obj.replace(original_obj.xpath(x_path)[0], modified_obj)

这会引发ValueError: Element is not a child of this node。 有没有办法可以很好地替换字符串?(仅使用 lxml)

请理解,我想要一个仅使用 lxml 库的解决方案。

4

1 回答 1

2

如您所知,您应该调用要替换的元素replace()的父级。您可以使用动态获取父级:.getparent()

batman = original_obj.xpath(x_path)[0]
batman.getparent().replace(batman, modified_obj)
于 2017-03-01T17:53:42.617 回答