2016-10-06 4 views
2

우리는 CentOS 환경에서 우리의 응용 프로그램을 다른 리눅스, 특히 우분투로 이식하려고합니다. 응용 프로그램은 python 기반이므로 문제가 없어야하지만 XPATH를 구문 분석 할 때 이상한 동작을 발견했습니다.동일한 xpath가 Centos, Ubuntu에서 다른 값을 반환합니다.

샘플 파일 :

<root> 
    <outer> 
     <inner> 
      <el/> 
     </inner> 
     <inner> 
      <el/> 
     </inner> 
    </outer> 
</root> 

코드 :

를 CentOS에
from lxml import etree 
r = etree.parse('foo.xml') 
print 'One: ', r.xpath('.//el[2]') 
print 'Two: ', r.xpath('(.//el)[2]') 

(파이썬 2.7.5) :

One: [<Element el at 0x25fdcf8>] 
New version: [<Element el at 0x25fdcf8>] 

레드햇 엔터프라이즈 6.6 (파이썬 2.7.11)

One: [] 
Two: [<Element el at 0x7fa27198cd40>] 
데비안과 우분투 (파이썬 2.7.9 및 2.7.12)에

는 :

One: [] 
Two: [<Element el at 0x7f94ed6cf200>] 

이 두 번째 요소 el에 액세스하려고 같은 코드입니다.

데비안, 우분투 및 센트 환경에는 lxml (pip에서 설치) 버전 3.6.4가 있습니다. 그것이 libxml2를 상대로 컴파일 LXML 설치하는 경우

데비안

:

에 CentOS에
$ dpkg -l | grep libxml2-dev 
ii libxml2-dev:amd64      2.9.1+dfsg1-5+deb8u2     amd64 

:

$ rpm -q libxml2-devel 
libxml2-devel-2.7.6-21.el6.x86_64 

무슨 일이야 :

$ rpm -q libxml2-devel 
libxml2-devel-2.9.1-6.el7_2.3.x86_64 

레드햇은 etree 3.6.0을 실행 여기에?

+0

같은 파이썬 버전? – Hackerman

+0

@Hackerman 아니오, 사실 데비안은 2.7.9를 실행했습니다. 2.7.22 우분투 및 2.7.5 센토. 그게 어떻게 관련 될 수 있니? – lorenzog

+0

'lxml.etree; lxml.etree.LIBXML_COMPILED_VERSION'을 각각에 가져 오는 것은 무엇입니까?당신이 특정 버전을 가지고 있기 때문에 그것이 컴파일 된 것을 의미하지는 않습니다. –

답변

1

CentOS의 결과가 잘못되었습니다.

libxml2 2.9.0은 회귀를 도입했다. libxml 2.9.0 XPath evaluation issue을 참조한다. 2.9.2에서 수정되었지만 2.9.1에서는 수정되지 않았습니다.

데비안 버전에 패치를 통합했습니다 2.9.1 + dfsg1-3 :

libxml2를 (2.9.1 + dfsg1-3) 불안정; 긴급 = 낮은

  • 데비안/패치/0007 - 수정 -와 - predicates.patch XPath를 최적화-:
    • 업스트림 패치는 XPath를 평가 문제를 해결합니다. (닫습니다 : # 713146)
+0

그래서 Debian보다 RedHat (2.7.6)에서 동일한 결과를 얻는 이유는 무엇입니까? – lorenzog

+0

@lorenzog 정확하게 RHEL은 libxml2 2.7.6을 사용하며 libxml2 2.9.0에 버그가 도입되었습니다. – Markus

+0

고마워요. 버그 보고서가 [n] 대신에 약간 다른 표기법 인 "position()"을 사용한다는 점을 감안하면 찾기가 불가능했을 것입니다. 어느 쪽이든, 많이 감사하겠습니다. – lorenzog

관련 문제