2013-04-09 2 views
5

У меня есть файл XML, похожее на это:LXML: вставить тег в заданном положении

<tag attrib1='I'> 
    <subtag1 subattrib1='1'> 
    <subtext>text1</subtext> 
    </subtag1> 
    <subtag3 subattrib3='3'> 
    <subtext>text3</subtext> 
    </subtag3> 
</tag> 

Я хотел бы, чтобы вставить новый подэлемент, так что результат будет что-то вроде этого

<tag attrib1='I'> 
    <subtag1 subattrib1='1'> 
    <subtext>text1</subtext> 
    </subtag1> 
    <subtag2 subattrib2='2'> 
    <subtext>text2</subtext> 
    </subtag2> 
    <subtag3 subattrib3='3'> 
    <subtext>text3</subtext> 
    </subtag3> 
</tag> 

Я могу добавить свой xml-файл, но затем новые элементы будут вставлены в конец. Как я могу заставить python lxml поместить его в заданную позицию?

Благодарим за помощь!

ответ

10

Вы можете использовать addnext() метод:

from lxml import etree 

XML= """ 
<tag attrib1='I'> 
    <subtag1 subattrib1='1'> 
    <subtext>text1</subtext> 
    </subtag1> 
    <subtag3 subattrib3='3'> 
    <subtext>text3</subtext> 
    </subtag3> 
</tag>""" 

parser = etree.XMLParser(remove_blank_text=True) 
tag = etree.fromstring(XML, parser) 

subtag1 = doc.find("subtag1") 
subtag2 = etree.Element("subtag2", subattrib2="2") 
subtext = etree.SubElement(subtag2, "subtext") 
subtext.text = "text2" 
subtag1.addnext(subtag2) # Add subtag2 as a following sibling of subtag1 

print etree.tostring(tag, pretty_print=True) 

Выход:

<tag attrib1="I"> 
    <subtag1 subattrib1="1"> 
    <subtext>text1</subtext> 
    </subtag1> 
    <subtag2 subattrib2="2"> 
    <subtext>text2</subtext> 
    </subtag2> 
    <subtag3 subattrib3="3"> 
    <subtext>text3</subtext> 
    </subtag3> 
</tag> 

Альтернатива: использование insert() на корневом элементе:

subtag2 = etree.Element("subtag2", subattrib2="2") 
subtext = etree.SubElement(subtag2, "subtext") 
subtext.text = "text2" 
tag.insert(1, subtag2) # Add subtag2 as the second child (index 1) of the root element 
Смежные вопросы