我们正在尝试将我们的应用程序从Centos环境移植到其他Linux,特别是Ubuntu。该应用程序是基于python的,所以应该没有问题,但是我们在解析XPATH时发现了奇怪的行为。
示例文件:
<root>
<outer>
<inner>
<el/>
</inner>
<inner>
<el/>
</inner>
</outer>
</root>
代码:
from lxml import etree
r = etree.parse('foo.xml')
print 'One: ', r.xpath('.//el[2]')
print 'Two: ', r.xpath('(.//el)[2]')
On Centos(python 2.7.5):
One: [<Element el at 0x25fdcf8>]
New version: [<Element el at 0x25fdcf8>]
在RedHat Enterprise 6.6(python 2.7.11)
上One: []
Two: [<Element el at 0x7fa27198cd40>]
在Debian和Ubuntu上(python 2.7.9和2.7.12):
One: []
Two: [<Element el at 0x7f94ed6cf200>]
这是尝试访问第二个元素el
的相同代码。
Debian,Ubuntu和Cents环境有lxml(从pip
安装)版本3.6.4。安装lxml时,它会针对libxml2编译它,这是
关于debian:
$ dpkg -l | grep libxml2-dev
ii libxml2-dev:amd64 2.9.1+dfsg1-5+deb8u2 amd64
关于centos:
$ rpm -q libxml2-devel
libxml2-devel-2.9.1-6.el7_2.3.x86_64
RedHat运行etree 3.6.0:
$ rpm -q libxml2-devel
libxml2-devel-2.7.6-21.el6.x86_64
这里发生了什么?
答案 0 :(得分:1)
CentOS的结果不正确。
libxml2
2.9.0引入了回归,请参阅libxml 2.9.0 XPath evaluation issue。它在2.9.2中修复,但在2.9.1中没有。
Debian已经在版本2.9.1 + dfsg1-3中集成了补丁:
libxml2(2.9.1 + dfsg1-3)不稳定;急=低
- 的Debian /贴剂/ 0007 - 定位XPath的优化与 - predicates.patch:
- 上游补丁修复XPath评估问题。 (关闭:#713146)