2013-04-09 5 views
5

Mam plik XML, podobną do tej:lxml: wstawić znacznik na danym stanowisku

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

chciałbym wstawić nowy podelementu, więc wynik będzie coś takiego

<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> 

Mogę dołączyć mój plik xml, ale wtedy nowe elementy zostaną wstawione na końcu. Jak zmusić Pythona Lxml do umieszczenia go w danej pozycji?

Dzięki za pomoc!

Odpowiedz

10

Można użyć metody 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) 

wyjściowa:

<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> 

alternatywna: użyj insert() na elemencie głównym:

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 
Powiązane problemy