我使用ElementTree在Python上解析XML文件。我发现cElementTree的C实现与常规实现相比工作得非常快。但我也发现了建筑:
xml.etree.cElementTree.iterparse(filename, parser=MyCystomParser())
不起作用。你会看到这样的东西:
__init__() got an unexpected keyword argument 'parser'
同时,"xml.etree.EElementTree.iterparse"的相同构造也可以工作。
我使用自定义解析器在解析XML文件时保留注释(默认解析器忽略/删除它)。
有人知道为什么在C实现中它不起作用吗?发布cElementTree时,"parser"参数已在ElementTree中。
有人知道为什么在C实现中它不起作用吗?
嗯,是的,因为记录了不起作用:
cElementTree
不支持解析器。
但他们为什么不让它发挥作用呢?
Python 2.5中包含的ElementTree版本在iterparse
上没有parser
参数。此功能仅在Python 3.2中添加。然后,它被后移植到Python2.7.*(注意,2.6中没有它。)
Python3.x没有cElementTree
——相反,它只有一个ElementTree
实现,它尽可能使用C加速器代码。因此,将新功能备份到cElementTree
要比备份到ElementTree
多得多。大概这对任何人来说都不够重要。
此外,请注意,ElementTree是由Frederik Lundh在Python的stdlib之外开发和维护的。我相信Gregory P.Smith推动了stdlib工作的集成,但我可能错了。所以,如果你想要更多的细节,你可以问他们中的任何一个,或者在python开发列表上问。但我敢肯定,答案只是"这还不够重要,不值得去做"。
*从技术上讲,它是在ElementTree 1.3中添加的,该版本包含在Python 3.2和2.7中。请参阅2.7和3.2的新增文档。