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