lxml - 无法替换儿童的孩子

时间:2017-03-01 17:48:08

标签: python-2.7 xpath lxml lxml.objectify

我在我的应用程序中使用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不是此节点的子节点。 有没有办法可以很好地替换字符串? (仅使用lxml)

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

1 个答案:

答案 0 :(得分:1)

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

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