2017-03-01 85 views
1

我正在使用lxml作为我的应用程序中XML解析的解决方案。lxml - 无法取代儿童的孩子

我明白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异常:元素不是此节点的子节点。 有没有一种方法可以很好地替换字符串? (仅使用lxml)

请理解,我希望只使用lxml库的解决方案。

回答

1

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

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

这对我有用。谢谢@alecxe。我可能错过了。 :) –