2017-01-21 5 views
2

Я пытаюсь написать XML-файл, но, как я бег ET.dump(root) я подвожу:ElementTree: TypeError: аргумент типа «Предложению» не итерация

<Reviews><Review rid="en_India'sGrill_477960693"><sentences><sentenceTraceback (most recent call last): 
    File "/usr/lib/python3.5/xml/etree/ElementTree.py", line 1078, in _escape_attrib 
    if "&" in text: 
TypeError: argument of type 'Sentence' is not iterable 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/media/Data/workspaces/git/master-thesis/python/thesis/semeval/slot1/nlp_cnn.py", line 421, in <module> 
    f.write(ET.dump(root)) 
    File "/usr/lib/python3.5/xml/etree/ElementTree.py", line 1165, in dump 
    elem.write(sys.stdout, encoding="unicode") 
    File "/usr/lib/python3.5/xml/etree/ElementTree.py", line 775, in write 
    short_empty_elements=short_empty_elements) 
    File "/usr/lib/python3.5/xml/etree/ElementTree.py", line 940, in _serialize_xml 
    short_empty_elements=short_empty_elements) 
    File "/usr/lib/python3.5/xml/etree/ElementTree.py", line 940, in _serialize_xml 
    short_empty_elements=short_empty_elements) 
    File "/usr/lib/python3.5/xml/etree/ElementTree.py", line 940, in _serialize_xml 
    short_empty_elements=short_empty_elements) 
    File "/usr/lib/python3.5/xml/etree/ElementTree.py", line 932, in _serialize_xml 
    v = _escape_attrib(v) 
    File "/usr/lib/python3.5/xml/etree/ElementTree.py", line 1090, in _escape_attrib 
    _raise_serialization_error(text) 
    File "/usr/lib/python3.5/xml/etree/ElementTree.py", line 1056, in _raise_serialization_error 
    "cannot serialize %r (type %s)" % (text, type(text).__name__) 
TypeError: cannot serialize <thesis.semeval_data.Sentence object at 0x7f9087f20400> (type Sentence) 

не знаю, что проблема есть. Я строю это очень прямолинейно:

root = ET.Element("Reviews") 
i = 0 
for k in review_dict: 

    review_element = ET.Element("Review") 
    root.append(review_element) 
    review_element.set("rid", k) 

    sentences_element = ET.Element("sentences") 
    review_element.append(sentences_element) 

    sentence_dict = review_dict[k] 

    for k in sentence_dict: 

     sentence_element = ET.Element("sentence") 
     sentence_element.set("id", k) 
     sentences_element.append(sentence_element) 

     sentence = sentence_dict[k] 

     text_element = ET.Element("text") 
     text_element.text = sentence.text 
     sentences_element.append(text_element) 

     opinions_element = ET.Element("Opinions") 
     sentence_element.append(opinions_element) 

     for category in aspect_categories[y_pred[i] > 0]: 
      opinion_element = ET.Element("Opinion") 
      opinion_element.set("category", category) 
      opinions_element.append(opinion_element) 

     i += 1 

f = open(os.path.join(os.path.curdir, "..", "..", "pred.xml"), "w") 

f.write(ET.dump(root)) # Exception 

Любая идея, почему я получаю эту ошибку? Сначала я подумал, что это потому, что я не избежал вещей, но кажется, что xml.etree.ElementTree делает это уже.

+0

Что находится в 'review_dict' и, следовательно, в' sentence_dict'? Что такое 'предложение.text' в частности? – schwobaseggl

+0

@schwobaseggl это просто очень ленивый способ создать XML. 'review_dict' сопоставляет идентификатор-отзыв с' предложением_dict', который является только картой из 'предложение_id' в объект' предложение'. Этот объект 'предложение 'имеет тип' Sentente' (тот, который указан из сообщения об ошибке. – displayname

+0

это что-то с элементом первого предложения, поскольку он сбрасывается сразу после '<предложение' – hansaplast

ответ

3

Просто посмотрите на трассировку: _escape_attrib() вызывает ошибку сериализации. Затем обратитесь к source: ElementTree ожидает, что значение атрибута элемента является строкой и ловит исключения, если это не так.

Проверьте тип значений, используемых как <sentence>: sentence_element.set("id", k). Один из них не является строкой.

+2

Это действительно проблема. ошибка в другом месте, которая привела к тому, что неправильный элемент был ключом для словаря! – displayname

Смежные вопросы