我有一个大的XML文件(大约600 MB),我试图使用带有iterparse的cElementTree解析。第一次尝试这个。
我正在迭代'产品'我处理每个产品后的标签和elem.clear()
。在我的解析中,我有一个函数parse_trips
,它使用for循环来解析<trip>
个标签内的<trips>
个标签(每个产品可能有数百个,每个数百行长)。
for trip in trips:
dump(trip)
get_date(trip, product)
set_price(trip, product)
然而,当我dump(trips)
时,我发现这些标签会在没有任何错误的情况下被提前截断/关闭。解析器似乎在内存中达到elem的最大长度,然后就不再保持了。
原始xml:
<trip>
<code>text</code>
<name>text</name>
<image>img.jpg</image>
<date>2014-08-10</date>
<pricing>
</pricing>
<itinerary>
<code>1</code>
<events>
<event>
eventInfo 1
</event>
<event>
eventInfo 2
</event>
<event>
eventInfo 3
</event>
<event>
eventInfo 4
</event>
<event>
eventInfo 5
</event>
<event>
eventInfo 6
</event>
<event>
eventInfo 7
</event>
<event>
eventInfo 8
</event>
</events>
</itinerary>
</trip>
我得到的输出是可能有6个这样的组,当我到达组中的第二次旅行时,dump(trip)
看起来像这样:
<trip>
<code>text</code>
<name>text</name>
<image>img.jpg</image>
<date>2014-08-10</date>
<pricing></pricing>
<itinerary>
<code>1</code>
<events>
<event>
eventInfo 1
</event>
<event>
eventInfo 2
</event>
<event>
eventInfo 3
</event>
</events>
</itinerary>
</trip>
以后的每一次旅行都消失了。我尝试循环,只是递增一个整数i
来计算有多少<trip>
个标签,它只到达第二个它截断然后结束for循环。
有没有办法查看/配置iterparse
可以抓取的元素的大小?或者一旦我去旅行以获取iter
的所有子节点,再次使用<trips>
?