Как я могу вставить элементы в группу похожих элементов - PullRequest
1 голос
/ 20 мая 2019

У меня есть XML, в котором есть группа похожих элементов, и мне нужно вставить элементы в середину этой группы

Например:

XML = """
<first>
<second>second element</second>
<third>third element</third>
<third>another third element</third>
<third>yet another third element</third>
</first>
"""

Мне нужно иметь возможность вставить другой элемент в середину третьих элементов.

Я пытался использовать findall:

from lxml import etree

parser = etree.XMLParser()
root = etree.fromstring(XML, parser)

newElement = etree.Element('third')
newElement.text = 'new element added'

elementList = root.findall('third')
elementList.insert(2, newElement)

print(etree.tostring(root))

Выход:

<first>
<second>second element</second>
<third>third element</third>
<third>another third element</third>
<third>yet another third element</third>
</first>

Что я пытаюсь сделать:

<first>
<second>second element</second>
<third>third element</third>
<third>another third element</third>
<third>new element added</third>
<third>yet another third element</third>
</first>

Я думаю, что я мог бы использовать root.insert(<place>, <element>), но фактический XML, который я пытаюсь изменить, намного больше (слишком велик, чтобы публиковать), и я не уверен, что это будет самый Pythonic способ сделать это.

Любая помощь будет принята с благодарностью. Спасибо

1 Ответ

0 голосов
/ 20 мая 2019

Это может быть то, что вы ищете:

xml = etree.fromstring(XML)

for item in xml.xpath('.'):
   newElement = etree.Element('third')  
   newElement.text = "new element added"
   nav = item.findall('third')  
   item.insert(item.index(nav[2]), newElement) 

etree.tostring(xml).decode().replace('\n','')

Вывод:

<first>
<second>second element</second>
<third>third element</third>
<third>another third element</third>
<third>new element added</third>
<third>yet another third element</third>
</first>
...