2008-10-26 4 views
4

XML의 새로운 기능. XPath를 찾고 파이썬 ElementTree의 형식의 XML 파일을 검색 할 수ElementTree를 사용한 XPath 검색

<root> 
<child>One</child> 
<child>Two</child> 
<child>Three</child> 
</root> 

"2"자식에 대한 검색을하고 돌아갑니다

참/거짓이

from elementtree import ElementTree 
root = ElementTree.parse(open(PathFile)).getroot() 

처럼 시작하게 된 경우 어떻게 이룰 수 있니?

답변

1

나는 최근에 ElementTree와 놀아 왔으며, 볼 수있다 ..

>>> from xml.etree import ElementTree 
>>> help(ElementTree.ElementPath) 
>>> root = ElementTree.fromstring(""" 
<root><child>One</child><child>Two</child><child>Three</child></root> 
""") 
>>> ElementTree.ElementPath.findall(root, "child") 
[<Element child at 2ac98c0>, <Element child at 2ac9638>, <Element child at 2ac9518>] 
>>> elements = ElementTree.ElementPath.findall(root, "child") 
>>> two = [x for x in elements if x.text == "Two"] 
>>> two[0].text 
'Two' 

이것이 올바른 모양입니다. 그것은 ElementPath가 제한된 xpath 지원을 가지고 있다고 말하지만, 그것은 전혀 지원하지 않는다고하지는 않습니다.

+0

는 "제한된 XPath는 지원"~ = "전혀 정말 XPath는 것이 아니라 않는 매우 단순화 된 쿼리 언어는 영감의 비트" –

1

다음 XPath 식을 평가하는 경우 :

        boolean(/*/*[.='Two'])

결과 사실 같은 소자 (상단 요소의 자식 문자열 값이 동일하도록하는 경우이며 그 이외의 경우에는

거짓이 존재합니다.

희망이 도움이되었습니다.

건배,

Dimitre Novatchev이 경우

+0

Charles는 "문서의 구조가 알려진 경우"// "약어를 사용하는 것이 좋지 않은 방법이라는 사실을 널리 인정합니다. 이는 엄청난 비효율을 초래합니다. 이 이유 때문에 당신이 당신보다 우수한 솔루션을 downvoted했다는 사실은이 분야에서 큰 문제가 있음을 보여줍니다. –

+0

XML DB와 인덱스를 사용하는 경우 ... 원본 질문에서 어디에서 언급 했습니까?/*/*/x는/nam1/name2/x보다 약간 더 빠르게 평가됩니다. XPath 엔진은 처음 두 위치 단계에서 이름을 확인할 필요가 없기 때문입니다. 죄송합니다, 다시 틀렸어. 건배, –

+0

Dimitre, // 깊이가 1 이상인 경우에만 샘플에없는 문제이며 - 색인 된 XML 파일은 * 이름을 확인해야하는 대신 이름으로 검색 할 수 있습니다. 속도가 빨라지므로 성능이 좋은 솔루션은 상황에 따라 다릅니다. –

관련 문제