有没有办法用 iterparse lxml 跳过 nodes/elements?

Is there a way to skip nodes/elements with iterparse lxml?

有没有办法使用 lxml iterparse 跳过一个元素而不检查标签?以此xml为例:

<root>
    <sample>
        <tag1>text1</tag1>
        <tag2>text2</tag2>
        <tag3>text3</tag3>
        <tag4>text4</tag4>
    </sample>
    <sample>
        <tag1>text1</tag1>
        <tag2>text2</tag2>
        <tag3>text3</tag3>
        <tag4>text4</tag4>
    </sample>
</root>
    

如果我关心 tag1tag4,检查 tag2tag3 会占用一些时间。如果文件不大,这并不重要,但如果我有一百万个 <sample> 个节点,如果我不必检查 tag2 和 [=16],我可以减少一些搜索时间=].他们总是在那里,我从不需要他们。

在 lxml

中使用 iterparse
import lxml

xmlfile = 'myfile.xml'
context = etree.iterparse(xmlfile, events('end',), tag='sample')

for event, elem in context:
    for child in elem:
        if child.tag == 'tag1'
            my_list.append(child.text)

            #HERE I'd like to advance the loop twice without checking tag2 and tag3 at all
            #something like:

            #next(child)
            #next(child)

        elif child.tag == 'tag4'
             my_list.append(child.text)
    

如果像在 iterparse 中那样在 iterchildren 中使用 tag arg,则可以“跳过”tag1tag4 以外的元素。

示例...

from lxml import etree

xmlfile = "myfile.xml"

my_list = []

for event, elem in etree.iterparse(xmlfile, tag="sample"):
    for child in elem.iterchildren(tag=["tag1", "tag4"]):
        if child.tag == "tag1":
            my_list.append(child.text)
        elif child.tag == "tag4":
            my_list.append(child.text)

print(my_list)

打印输出...

['text1', 'text4', 'text1', 'text4']