lxml.etree.XMLSyntaxError:没有属性声明

时间:2016-03-11 08:46:32

标签: python xml python-2.7 lxml

我正在尝试使用dblp数据集将xml文件转换为csv文件。现在,我使用iterparse()来解析xml文件。

这是我的代码:

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。否则会报告:

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

'ouml','uuml'等实体出现在xml文件中,并在dtd文件中定义。虽然将dtd_validation设置为false可以防止No声明错误,但会发生此错误。

2 个答案:

答案 0 :(得分:0)

没有看到您的XML或DTD,很难说。听起来您的XML违反了DTD,因为它定义了DTD中未列出的特定元素的“mdate”属性。您肯定需要DTD,因为它在XML中定义了至少一个特殊字符,因此删除DTD是不可能的。

您是否可以将“mdate”属性添加到DTD中,以便解析器接受您的XML?

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

答案 1 :(得分:0)

您的xml文件需要具有以下内容:

<!DOCTYPE dblp SYSTEM "dblp.dtd">

如果您开始修复Entity 'ouml',则可以取消以前的依赖关系。