如何替换整个XML树? 假设我有一个文件,看起来像:
<root>
<folder>
<elem1>'something here'</elem1>
<elem2>'more stuff here'</elem2>
<elem3>
<sub1>'something else here'</sub1>
<sub2>'blablabla'</sub2>
</elem3>
<elem4>'even more stuff here with subelements too'</elem4>
</folder>
</root>
我还有另一个xml文件,它可以作为elem3
的替代文件,如下所示:
<NewElem>
<Difsub1>'something else here, but different'</Difsub1>
<Difsub2>'all sorts of different blablabla'</Difsub2>
</NewElem>
我需要的是将elem3
替换为NewElem
,这将导致:
<root>
<folder>
<elem1>'something here'</elem1>
<elem2>'more stuff here'</elem2>
<NewElem>
<Difsub1>'something else here, but different'</Difsub1>
<Difsub2>'all sorts of different blablabla'</Difsub2>
</NewElem>
<elem4>'even more stuff here with subelements too'</elem4>
</folder>
</root>
我正在使用xml.etree.ElementTree
并试图append
它,但我最终得到了NewElem
,在</folder>
之后。我无法删除更新的xml文件的elem3
我尝试使用以下命令追加它:
import xml.etree.ElementTree as ET
tree = ET.parse('base.xml')
baseroot = tree.getroot()
tree2 = ET.parse('new.xml')
newroot = tree2.getroot()
old_element = baseroot.findall('.//elem3')
baseroot.append(newroot)
baseroot.remove(old_element)
随着NewElem
被追加到文件夹之后,我需要在elem3
所在的相同位置,或者至少在<folder>
内
此外,删除时,我会收到一个错误:
TypeError: remove() argument must be xml.etree.ElementTree.Element, not list
如果我换成
old_element = baseroot.find('.//elem3')
baseroot.append(newroot)
baseroot.remove(old_element)
我得到了非常相似的错误:ValueError: list.remove(x): x not in list
下面使用的是
lxml
包,这是一个优于ElementTree
的XML包。 您可以使用父元素的index(element)
方法找到要替换的节点的索引一旦您得到了,您就可以使用父节点的
insert(index, element)
,并将新节点插入到旧节点的位置接下来是通过
remove(element)
方法删除旧节点示例“p”是父元素,
a
是要替换的p
的子节点,b
是新的子节点:使用
ElementTree
,您需要首先找到旧元素的索引:如果您坚持使用“ElementTree”,首先您应该意识到擦除只在直接包含要删除的节点的节点上起作用
所以在这样寻找它的时候
很好,您不能从baseroot中删除它,您需要获取它所在的位置,然后从那里删除它。最简单的方法必须是找到它的父对象
可以使用子元素添加新元素
首先,感谢@egur和@Henrik的指导,特别是指向另一个图书馆。我正在使用lxml(and this documentation),因此我可以使用以下代码执行我想要的操作:
上述代码产生以下结果:
注意
NewElem
在elem4
之后,不是在elem3
的确切位置,而是在folder
之内,所以我认为这解决了我想要的问题相关问题 更多 >
编程相关推荐