I have a xml similar to following xml. I am trying get elements of name "elem" based on attribute "id" of some range.
Eg: get all "elem" elements from id=4 to id = 8.
<all_levels>
<level1>
    <level2>
        <level3>
        <elem id="1"> </elem>
        <elem id="2"> </elem>
        </level3>
        <level3>
        <elem id="3"> </elem>
        <elem id="4"> </elem>
        </level3>
    </level2>
    <level2>
        <level3>
        <elem id="5"> </elem>
        <elem id="6"> </elem>
        </level3>
        <level3>
        <elem id="7"> </elem>
        <elem id="8"> </elem>
        </level3>
    </level2>
</level1>
<level1>
    <level2>
        <level3>
        <elem id="9"> </elem>
        <elem id="10"> </elem>
        </level3>
        <level3>
        <elem id="11"> </elem>
        <elem id="12"> </elem>
        </level3>
    </level2>
    <level2>
        <level3>
        <elem id="13"> </elem>
        <elem id="14"> </elem>
        </level3>
        <level3>
        <elem id="15"> </elem>
        <elem id="16"> </elem>
        </level3>
    </level2>
</level1>
</all_levels>
I have tried two methods: 1) Using xpath to get required "elem" elements like getting elements from range (4,8)
from lxml import etree
sample_xml = etree.parse("sample_xml.xml")
elem1 = sample_xml.xpath("//word[@id = '%s']" % str(4))[0]
elem2 = sample_xml.xpath("//word[@id = '%s']" % str(5))[0]
elem3 = sample_xml.xpath("//word[@id = '%s']" % str(6))[0]
elem4 = sample_xml.xpath("//word[@id = '%s']" % str(7))[0]
elem5 = sample_xml.xpath("//word[@id = '%s']" % str(8))[0]
but if range is large , it is taking too much time to get all elements.
2)use xpath to get first elem in the range, the use getnext() method to get sibilings
from lxml import etree
sample_xml = etree.parse("sample_xml.xml")
elem1 = sample_xml.xpath("//word[@id = '%s']" % str(4))[0]
elems = [elem1]
curr_word = elem1
current_id = 4
while(current_id <= 8):
    curr_elem = curr_word.getnext()
    elems.append(curr_elem)
    current_id += 1
but the problem is getnext() only gets elem in the same tree. so it cannot get all other elems.
Is there a better way to get elems in a range better than using xpath?