我正在尝试使用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声明错误,但会发生此错误。
答案 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'
,则可以取消以前的依赖关系。