0

在 python 2.6 中,我需要抑制命名空间前缀。我使用了此处发布的解决方案并且它可以工作,但是,当我使用 cElementTree 来进行更快的解析时,它会中断。从我的日志中:

25/09/2013 20:04:05 'module' object has no attribute '_namespace_map'

两种实现之间是否存在一些潜在的差异?还有另一种解决方法吗?我拥有的模块版本:

>>> import xml.etree.ElementTree as et
>>> et.VERSION
'1.2.6'
>>> import xml.etree.cElementTree as cet
>>> cet.VERSION
'1.0.6'
>>> 

谢谢!

4

1 回答 1

1

没有理由期望这会奏效。jterrace 在 ElementTree 的内部进行了挖掘,并提出了一个直接作用于这些内部的 hacky woraround。您正在尝试在具有不同内部结构的不同实现中使用它,所以它当然不会起作用。


但是……如果您查看cElementTree 的源代码,您会发现它处理名称空间注册的方式是……执行一些导入ElementTree和使用名称空间注册表的 Python 代码。所以,而不是这个:

import xml.etree.cElementTree as etree

# ...

if namespace_uri not in etree._namespace_map:

您也许可以只导入两者,然后将其关闭ElementTree而不是cElementTree. 例如:

import xml.etree.cElementTree as etree
import xml.etree.ElementTree

# ...

if namespace_uri not in ElementTree._namespace_map:

(显然对它的其他引用做同样的事情。)

不保证这会奏效。它会让你摆脱这个错误,但你必须阅读代码以查看替换fixtag是否会对你想要的 cElementTree 产生相同的效果,或者你是否需要做其他事情。

于 2013-09-25T18:46:56.213 回答