有没有办法用 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>
如果我关心 tag1
和 tag4
,检查 tag2
和 tag3
会占用一些时间。如果文件不大,这并不重要,但如果我有一百万个 <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,则可以“跳过”tag1
和 tag4
以外的元素。
示例...
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']
有没有办法使用 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>
如果我关心 tag1
和 tag4
,检查 tag2
和 tag3
会占用一些时间。如果文件不大,这并不重要,但如果我有一百万个 <sample>
个节点,如果我不必检查 tag2
和 [=16],我可以减少一些搜索时间=].他们总是在那里,我从不需要他们。
在 lxml
中使用 iterparseimport 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,则可以“跳过”tag1
和 tag4
以外的元素。
示例...
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']