2016-03-11 168 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 

我想這可能會導致從由於所有屬性都在dtd文件中聲明,因此無法驗證dtd驗證。我也試圖谷歌,如果有任何解釋我的問題,但沒有找到一個好的。

任何人都可以解釋它並告訴我如何解決它?非常感謝你。

----------- ---------更新

我覺得我確實需要dtd_validation。否則,它會報告:發生在XML文件

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

實體,如「ouml」,「uuml」,並在DTD文件中定義。儘管將dtd_validation設置爲false可防止出現No聲明錯誤,但會發生此錯誤。

+0

你真的需要做dtd驗證嗎?如果沒有,那麼爲什麼設置'dtd_validation = True'? – har07

+0

@ har07 \t 我忘記說了,我想我需要dtd_validation,因爲dtd文件在xml文件中定義了一些實體。如果沒有dtd文件,它將報告以下錯誤:lxml.etree.XMLSyntaxError:實體'ouml'未定義,第47行,第25列 – Wulipapa

回答

0

沒有看到您的XML或DTD,很難說。這聽起來像你的XML違反了DTD,因爲它定義了一個沒有列在DTD中的特定元素的「mdate」屬性。您肯定需要DTD,因爲它在XML中至少定義了一個特殊字符,因此刪除DTD不存在問題。

是否可以將'mdate'屬性添加到DTD中,以便解析器可以接受您的XML?

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

這是元素'article'的dtd文件的一部分:<!ELEMENT article(%field; )*> <!ATTLIST文章 關鍵CDATA #REQUIRED mdate CDATA #IMPLIED publtype CDATA #IMPLIED reviewid CDATA #IMPLIED 評級CDATA #IMPLIED >我覺得mdate在DTD文件中定義。這就是爲什麼我對這個問題感到困惑。 Idk這怎麼可能發生。 – Wulipapa

+0

同意。你可以添加XML和DTD的問題? – pholtz

+0

仍然無法正常工作。我在這裏獲得數據集,包含了dtd文件,並試圖拆分xml文件。我不確定你是否想看看。但即使我將dtd文件放在xml中,也沒有幫助。 – Wulipapa