2017-03-01 173 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。我可能錯過了。 :) –