2016-03-11 4 views
0

Я пытаюсь использовать набор данных dblp для преобразования xml-файла в файл csv. Прямо сейчас я использую iterparse() для анализа XML-файла.lxml.etree.XMLSyntaxError: Нет объявления для атрибута

Вот мой код:

def iterpar(): 
    f = open(dblp.xml', 'rb') 

    context = etree.iterparse(f, dtd_validation=True, events=("start", "end")) 
    context = iter(context) 
    event, root = next(context) 
    for event, ele in context: 
     print event 
     print ele 

Однако, когда я пытался напечатать что-то, чтобы увидеть, что это такое, было выдано сообщение об ошибке:

Traceback (most recent call last): 
    File "C:\dblp\Data\XML2csv", line 34, in <module> 
    iterpar() 
    File "C:\dblp\Data\XML2csv", line 29, in iterpar 
    for event, ele in context: 
    File "iterparse.pxi", line 208, in lxml.etree.iterparse.__next__ (src\lxml\lxml.etree.c:131498) 
lxml.etree.XMLSyntaxError: No declaration for attribute mdate of element article, line 4, column 19 

Я предполагаю, что это может быть результатом fail dtd validation, потому что все атрибуты объявлены в файле dtd. Я также пытался Google, если есть какие-либо объяснения моей проблемы, но не нашел хорошего.

Может кто-нибудь объяснить это и сказать мне, как это исправить? Большое спасибо.

----------- обновление ---------

Я думаю, что мне нужно dtd_validation. В противном случае он сообщит:

lxml.etree.XMLSyntaxError: Entity 'ouml' not defined, line 47, column 25 

Сущности как «ouml», «» uuml происходит в XML-файле, и определяется в файле DTD. Хотя установка dtd_validation как ложная, предотвращает ошибку объявления объявления, но это произойдет.

+0

Нужно ли вам выполнять валидацию dtd? Если нет, то зачем устанавливать 'dtd_validation = True'? – har07

+0

@ har07 \t Я забыл сказать, я думаю, что мне нужно dtd_validation, потому что файл dtd определяет некоторые объекты в XML-файле. Без файла dtd он сообщит следующую ошибку: lxml.etree.XMLSyntaxError: Entity 'ouml' не определен, строка 47, столбец 25 – Wulipapa

ответ

0

Не видя своего XML или DTD, трудно сказать. Похоже, ваш XML нарушает DTD, потому что он определяет атрибут 'mdate', который не указан в DTD для определенного элемента. Вам определенно нужен DTD, потому что он определяет по крайней мере один специальный символ в вашем XML, поэтому удаление DTD не может быть и речи.

Возможно ли добавить атрибут 'mdate' в DTD, чтобы синтаксический анализатор принял ваш XML?

<!ATTLIST element-name attribute-name attribute-type #IMPLIED> 
+0

Это часть файла dtd для статьи элемента: Я думаю, что mdate уже определена в ОТД файле. Вот почему я смущен этой проблемой. Идк, как это могло произойти. – Wulipapa

+0

Согласовано. Можете ли вы добавить XML и DTD к вопросу? – pholtz

+0

Все еще не работает. Я получаю набор данных здесь, файл dtd включен, и я попытался разбить файл xml. Я не уверен, если вы хотите посмотреть. Но даже если я поместил dtd-файл в xml, это не поможет. – Wulipapa

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