在python

时间:2017-11-15 09:59:04

标签: python xml lxml elementtree xml.etree

我在XML文件中有一个元素:

<condition>
  <comparison compare="and">
    <operand idref="XXX" type="boolean" />
  </comparison>
</condition>

我需要添加另外两个子元素(child1和child2),例如:

<condition>
  <child1 compare='and'>
    <child2 idref='False' type='int' /> 
    <comparison compare="and">
      <operand idref="XXX" type="boolean" />
    </comparison>
  </child1>
</condition>

我继续使用lxml:

from lxml import etree
tree = etree.parse(xml_file)
condition_elem = tree.find("<path for the condition block in the xml>")
etree.SubElement(condition_elem, 'child1')
tree.write( 'newXML.xml', encoding='utf-8', xml_declaration=True)

这只是将元素child1添加为元素条件的子元素,如下所示,并且不满足我的要求:

<condition>
  <child1></child1>
  <comparison compare="and">
    <operand idref="XXX" type="boolean" />
  </comparison>
</condition>

有什么想法吗?感谢

1 个答案:

答案 0 :(得分:1)

在它的etree子模块上使用lxml的objectify子模块,我会从root中删除比较元素,将child1元素添加到它并将东西比较重新添加到:

from lxml import objectify

tree = objectify.parse(xml_file)
condition = tree.getroot()
comparison = condition.comparison

M = objectify.ElementMaker(annotate=False)
child1 = M("child1", {'compare': 'and'})
child2 = M("child2", {'idref': 'False', 'type': 'int'})

condition.remove(comparison)
condition.child1 = child1
condition.child2 = child2
condition.child1.comparison = comparison

ElementMaker是一个易于使用的工具,用于创建新的xml元素。我首先是它的一个实例(M)没有注释xml(用属性丢弃它),然后使用该实例创建子项,你要求。我认为其余部分是相当自我解释的。