Убедитесь, что ввод является правильно сформированным xml.
Для обработки большого XML-файла с ограниченной памятью вы можете использовать ElementTree.iterparse()
:
#!/usr/bin/env python
import xml.etree.cElementTree as etree
def getelements(source, tag):
context = iter(etree.iterparse(source, events=('start', 'end')))
_, root = next(context) # get root element
for event, elem in context:
if event == 'end' and elem.tag == tag:
yield elem
root.clear() # free memory
for elem in getelements('big.xml', 'person'):
print '^'.join(elem.find(tag).text for tag in 'name age address'.split())
Вы можете добавить специальную обработку для многострочного текста внутри тега (как в вашем примере для address
), например, вы можете использовать re.sub(r'\s+', ' ', text)
для нормализации пробелов.
Tom^18^London, xxx street, xxx building
John^22^Canberra, xxx street, xxx building, xxx floor, xxx room, xxx bed
Если входной xml может содержать '^'
, и вы хотите его избежать, тогда вы можете использовать csv
module для вывода.