2013-04-09 32 views
5

Tôi có một tập tin xml, tương tự như sau:lxml: chèn thẻ tại một vị trí nhất định

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

Tôi muốn chèn một subElement mới, vì vậy kết quả sẽ là một cái gì đó như thế này

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

Tôi có thể nối thêm tệp xml của mình, nhưng sau đó các phần tử mới sẽ được chèn vào cuối. Làm thế nào tôi có thể buộc lxml python để đặt nó vào một vị trí nhất định?

Cảm ơn sự giúp đỡ của bạn!

Trả lời

10

Bạn có thể sử dụng phương pháp 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) 

Output:

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

Alternative: sử dụng insert() trên phần tử gốc:

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 
Các vấn đề liên quan