我使用ElementTree解析Python上的XML文件。我发现cElementTree的C实现与常规实现相比非常快。但我也发现了建筑:
xml.etree.cElementTree.iterparse(filename, parser=MyCystomParser())
不会工作。你会看到类似的东西:
__init__() got an unexpected keyword argument 'parser'
同时使用'xml.etree.ElementTree.iterparse'的相同构造确实有效。
我在解析XML文件时使用自定义解析器来保留注释(默认解析器忽略/删除它)。
有谁知道为什么在C实现中它不起作用?当cElementTree发布时,'parser'参数已经在ElementTree中了。
答案 0 :(得分:1)
有没有人知道为什么在C实现中它不起作用?
嗯,是的,因为documented无效:
cElementTree
不支持解析器。
但他们为什么不让它发挥作用呢?
包含在Python 2.5中的ElementTree版本在parser
上没有iterparse
参数。此功能仅在Python 3.2中添加。然后它被移植到Python 2.7。*(请注意,它不在2.6中。)
Python 3.x没有cElementTree
- 相反,它只有一个ElementTree
实现,并且尽可能使用C加速器代码。因此,将新功能向后移植到cElementTree
比向ElementTree
移植要多得多。并且可能对任何人来说都不够重要。
另外,请注意,ElementTree是由Frederik Lundh here在Python的stdlib之外开发和维护的。我相信Gregory P. Smith推动了整合到stdlib的工作,但我可能错了。因此,您可以询问其中任何一个,或者询问python-dev列表,是否需要更多详细信息。但我很确定答案只是“它不够重要,无法做到”。
*从技术上讲,它是在ElementTree 1.3中添加的,该版本包含在Python 3.2和2.7中。请参阅2.7和3.2的新文档。