在特定位置插入xml个节点

Insert xml node in specific location

我想构建以下 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?

使用 etree.SubElement 始终将子元素附加到 parent 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(使其成为 second child 在 <Item>).

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>