Я пытаюсь использовать Python для анализа большого файла XML (27 ГБ), используя cElementTree и iterparse. Я могу извлечь все теги, но по какой-то причине ни один текст элемента не извлекается (он всегда показывает «Нет»). Я проверил документацию и StackOverflow, но безрезультатно. В крайнем случае я попробовал анализ с помощью lxml, и он работает, но я бы предпочел, если это возможно, выяснить это на cElementree. Обновление: когда я комментирую строку elem.clear(), она показывает анализируемые данные, но теперь я пытаюсь понять, почему метод clear() стирает данные до того, как они будут напечатаны (в конечном итоге я хочу поместить данные в отдельную структуру данных, например базу данных). Я предполагаю, что мне нужно очистить данные, чтобы я не использовал память во время разбора файла. Это одна из тех ситуаций, когда «все в Python является объектом»?
Используя меньший образец, извлеченный из файла, я все еще получаю ту же ошибку. XML-файл выглядит примерно так (хотя в нем гораздо больше записей):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><entityList><entity
xmlns:ns2="urn:hl7-org:v3" xmlns:ns3="urn:axolotl-com:pdo">
<fragmentId>d68e616e-a6bc-4630-b104-3891859a8ce4</fragmentId>
<aggregateId>H1060734453</aggregateId>
<source>b6167864-5f74-40e5-97c5-7e551a3a4a7d</source>
<sourceName>SHM ADT</sourceName>
<sourceOid>2.16.840.1.113883.3.2.2.3.1.21.3</sourceOid>
<sourceAaoid>2.16.840.1.113883.3.62.2</sourceAaoid>
</entity></entityList>
Вот фрагмент некорректно работающего кода:
import xml.etree.ElementTree as etree
xml=r'C:\sample.xml'
count = 0
for event, elem in etree.iterparse(xml):
if event == 'end':
if elem.tag == 'entity':
count+=1
for child in elem:
print (child.tag, child.attrib, child.text)
elem.clear()
print(count)
я собираюсь
fragmentId {} None
aggregateId {} None
source {} None
sourceName {} None
sourceOid {} None
sourceAaoid {} None
Почему elem.clear() стирает текст, хотя кажется, что сначала должна произойти печать? Какие-либо предложения?