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