【问题标题】:lxml.etree.XMLSyntaxError: No declaration for attributelxml.etree.XMLSyntaxError:没有属性声明
【发布时间】:2016-06-26 10:23:30
【问题描述】:

我正在尝试使用 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 declaration 错误,但是会发生这种错误。

【问题讨论】:

  • 你真的需要做 dtd 验证吗?如果不是,那为什么要设置dtd_validation=True
  • @har07 我忘了说,我想我确实需要 dtd_validation,因为 dtd 文件在 xml 文件中定义了一些实体。没有dtd文件,会报如下错误:lxml.etree.XMLSyntaxError: Entity 'ouml' not defined, line 47, column 25

标签: python xml python-2.7 lxml


【解决方案1】:

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

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

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

【讨论】:

  • 这是元素 'article' 的 dtd 文件的一部分: 我认为 mdate 已在 dtd 文件中定义。这就是为什么我对这个问题感到困惑。我知道这怎么会发生。
  • 同意。您可以在问题中添加 XML 和 DTD 吗?
  • 还是不行。我在这里获取数据集,包含dtd文件,并尝试拆分xml文件。我不确定你是否想看看。但是即使我把dtd文件放到xml里面也没用。
【解决方案2】:

您的 xml 文件需要与此类似:

&lt;!DOCTYPE dblp SYSTEM "dblp.dtd"&gt;

如果你开始修复Entity 'ouml',你可以打破之前的依赖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 2012-11-23
    • 2015-09-26
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多