2015-03-08 1 views
0

Я пытаюсь проанализировать XML-файл с помощью cElementTree.iterparse. Однако я не могу понять, что происходит, потому что iterparse возвращает пустые элементы. У меня есть файл XML, который имеет следующий примерный макет:Почему cElementTree iterparse возвращает None элементов?

<DOCS> 
    <ID id="1"> 
    <HEAD>title1</HEAD> 
    <DATE>21.01.2010</DATE> 
    <TEXT> 
     <P>some text</P> 
     <P>some text</P> 
     <P>some text</P> 
    </TEXT> 
    </ID> 

    <ID id="2"> 
    <HEAD>title2</HEAD> 
    <DATE>21.01.2010</DATE> 
    <TEXT> 
     some text 
    </TEXT> 
    </ID> 
</DATA> 

Я пытаюсь извлечь текст из тега TEXT или перебирать TEXT тега детей (P тегов) и извлечение текста из них.

Вот мой код:

import xml.etree.cElementTree as cet 

docs = {} 
id = '' 
for event, elem in cet.iterparse(xml_data, events=('end',)): 
    if elem.tag == 'ID': 
     id = elem.attrib['id'] 
    if elem.tag == 'TEXT': 
     if list(elem): 
      docs[id] = ''.join([p.text for p in elem]) 
     else: 
      docs[id] = elem.text 
#print(docs) 
return docs 

Когда я исполню мой код я получаю:

docs[id] = ''.join([p.text for p in elem]) 
TypeError: sequence item 14: expected str instance, NoneType found 

Это означает, что один из p в списке понимание [p.text for p in elem] является None. Хорошо, я использовал операторы печати, чтобы узнать, какой был предыдущий текст p, чтобы узнать, есть ли что-то не так с XML-тегами. Ну, элемент p, который не имеет никакого текста, должен иметь его, потому что он имеет текстовое тело в XML-файле. Может кто-нибудь объяснить, что происходит?

ответ

0

Глупо ошибка в обращении if event == 'end': проверка.

Итак, что происходит, только когда event == 'end' у нас есть полностью заполненный объект elem.