He tenido éxito con el método cElementTree.iterparse para realizar una tarea similar.
Tenía un documento xml grande con 'entradas' repetidas con la etiqueta 'resFrame' y quería filtrar las entradas para una identificación específica. Aquí está el código que he utilizado para ello:
documento de origen tuvo esta estructura
<snapDoc>
<bucket>....</bucket>
<bucket>....</bucket>
<bucket>....</bucket>
...
<resFrame><id>234234</id>.....</resFrame>
<frame><id>344234</id>.....</frame>
<resFrame>...</resFrame>
<frame>...</frame>
</snapDoc>
que utilizó la siguiente secuencia de comandos para crear un documento más pequeño que tenía la misma estructura, las entradas de cubo y sólo las entradas resFrame con una identificación específica
#!/usr/bin/env python2.6
import xml.etree.cElementTree as cElementTree
start = '''<?xml version="1.0" encoding="UTF-8"?>
<snapDoc>'''
def main():
print start
context = cElementTree.iterparse('snap.xml', events=("start", "end"))
context = iter(context)
event, root = context.next() # get the root element of the XML doc
for event, elem in context:
if event == "end":
if elem.tag == 'bucket': # i want to write out all <bucket> entries
elem.tail = None
print cElementTree.tostring(elem)
if elem.tag == 'resFrame':
if elem.find("id").text == ":4:39644:482:-1:1": # i only want to write out resFrame entries with this id
elem.tail = None
print cElementTree.tostring(elem)
if elem.tag in ['bucket', 'frame', 'resFrame']:
root.clear() # when done parsing a section clear the tree to safe memory
print "</snapDoc>"
main()
Trate http://stackoverflow.com/search?q=iterparse – jfs
si utiliza jython y JVM de 64 bits, puede utilizar extendida ETV-xml para hacer la división, la más elegante// tipo eficiente sencilla –