4

我有一个大型 XML 文件(大约 600 MB),我正在尝试使用带有 iterparse 的 cElementTree 进行解析。第一次尝试这个。

在处理每个产品后,我正在迭代“产品”标签和elem.clear()-ing。在我的解析中,我有一个函数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>

4

0 回答 0