在特定位置插入xml节点

时间:2015-06-05 19:16:04

标签: python xml lxml

我想构建以下xml:

<Item>
    <Name>Hello</Name>
    <Date>2014-01-01</Date>
    <Hero>1</Helo>
</Item>

鉴于以下代码结构,如何在英雄节点之前插入<Date>节点

item = etree.SubElement(self.xml_node, 'Item')
etree.SubElement(item, 'Name').text = 'Hello'
etree.SubElement(item, 'Hero').text = 1
# Now, how to insert the 'Date' element before the Hero element?

2 个答案:

答案 0 :(得分:6)

使用etree.SubElement始终将子元素附加到父item的末尾。因此,要在特定位置插入新元素,请使用item.insert(pos, subelement)

import lxml.etree as etree
xml_node = etree.Element("node")
item = etree.SubElement(xml_node, 'Item')
etree.SubElement(item, 'Name').text = 'Hello'
etree.SubElement(item, 'Hero').text = '1'
etree.SubElement(item, 'Date').text = '2014-01-01'
item.insert(1, item[-1])
print(etree.tostring(xml_node, pretty_print=True))

产量

<node>
  <Item>
    <Name>Hello</Name>
    <Date>2014-01-01</Date>
    <Hero>1</Hero>
  </Item>
</node>

ElementTree中的每个节点只能出现在一个地方。所以虽然

etree.SubElement(item, 'Date').text = '2014-01-01'

<Date>节点放在<item>的末尾,

item.insert(1, item[-1])

item中的最后一个节点(即<Date>节点)移动到位置1(使其成为{{1}中的第二个子节点}})。

答案 1 :(得分:0)

etree元素的行为类似于列表,因此只需使用.insert()

>>> from xml.etree import ElementTree as etree

>>> parent = etree.Element('parent')

>>> etree.SubElement(parent, 'child1')
<Element 'child1' at 0x108797048>

>>> etree.SubElement(parent, 'child2')
<Element 'child2' at 0x108797188>

>>> el = etree.Element('child-one-and-a-half')
>>> parent.insert(1, el)

>>> etree.dump(parent)
<parent><child1 /><child-one-and-a-half /><child2 /></parent>