2014-07-21 2 views
3

.findall()을 사용하여 트리의 여러 요소를 일치시키는 방법이 있습니까?.findall()은 python etree에서 여러 값을 일치시킬 수 있습니까?

내가이 일을하고 싶습니다 :

trees = log.findall('element1') 
if not trees: 
    trees = log.findall('element2') 
:이 (내가 같은 XML 모두 E1과 E2가 없기 때문에 내 경우에는 작동)의 주위에 내 작품

trees = log.findall('element1' or 'element2') 

비슷한 구조이지만 이름이 다른 XML 파일을 구문 분석하고 있습니다. C#에서는 "element1 | element2"일치가 허용됩니다.

+0

해결 방법을 통해, element1과 element2에 모두 요소가있는 경우 어떻게해야합니까? –

+0

좋은 지적. 좀 더 명확하게 질문을 편집했습니다. 나는 1과 2 중 하나를 사용하는 보일러 용 도금 코드입니다. –

+1

@ user3769076 : stdlib'xml.etree' 대신'lxml'이 필요하고'lxml.etree'를 사용할 수 있습니까? 종종 드롭 인 대체품으로 작동하며 더 나은 답변을 제공합니다. – abarnert

답변

7

아니요, 불가능합니다. C#은 XPath 표현식을 사용하는 것처럼 보입니다. 그러나 ElementTree XPath support for XPath queries은 너무 제한되어 있으며이를 지원하지 않습니다.

첫 번째가 비어있는 경우 두 번째 검색을 선택하는 or를 사용할 수 있습니다

trees = log.findall('element1') or log.findall('element2') 

를 빈 결과가 false-Y이기 때문이다.

대안은 lxml이며 libxml2 위의 ElementTree API 구현 인 supports all of the XPath 1.0 spec입니다. 그런 다음 다음을 수행 할 수 있습니다.

log.xpath('.//(element1|element2)') 
+0

etree API의'lxml' 구현은 XPath에서'| '를 지원합니까? 그렇다면 그것은 OP를위한 수용 가능한 대안 일 수 있습니다. – abarnert

+0

@abarnert :'lxml'은 XPath 1.0을 모두 지원합니다. –

+0

그래, 나는 그것의 etree'findall'에 XPath가 모두 있는지 여부를 확신하지 못한다. (그리고 어떤 이유인지 그것은 내가 앉아있는 컴퓨터에 구축되지 않아서 테스트 할 수 없다 ...). – abarnert