ElementTree XPath 异常行为
你好,
我在使用 Python 2.7 的 ElementTree
(1.3 版本)时,觉得它的 XPath 功能很不错,
不过有一个搜索结果让我感到意外。
这是我的 XML 示例:
<OTF>
<FECS state="disabled" version="2.2.0.0">
<BackEndCompatibility major="2.2" state="disabled">
<BackEnd state="disabled" version="2.2.0.0"/>
</BackEndCompatibility>
</FECS>
</OTF>
问题 1:
当我用 findall
来获取第一个找到的元素时,
version = "2.2.0.0"
found = list(txml.findall(".//BackEnd[@version='%s']" % version))
return found and found[0] or None
它什么都没找到。
但是当我修改 XML 文件,让 BackEnd
元素里面有了 子元素,
<BackEnd state="disabled" version="2.2.0.0">
<any_dummy_element/>
</BackEnd>
然后搜索的元素就能正确找到。
你遇到过这样的情况吗?
我是不是做错了什么,还是说这是 ElementTree
的一个 bug?
问题 2:
我还有一个问题是关于 xmlns
的。
假设我把 XML 的第一行改成包含 xmlns
:
<OTF xmlns="http://si-wiki/OTFCompatibility">
</OTF>
在这种情况下,我必须把查找字符串改成:
".//{http://si-wiki/OTFCompatibility}BackEnd[@version='%s']"
有没有办法让 ElementTree 在解析时忽略 xmlns
,并把所有元素的名字(包括根元素)当作没有前缀来处理呢?
祝好,
Zbigniew
1 个回答
1
对于第一个问题:
当我把这几行
found = list(txml.findall(".//BackEnd[@version='%s']" % version))
return found and found[0] or None
换成
found = txml.findall(".//BackEnd[@version='%s']" % version)
if found:
return found[0]
return None
之后,就能得到正确的结果,而不需要使用那些临时的子元素技巧。