Python의 xml 라이브러리를 사용하면 XML 파일에서 원하는 어떤 노드든 자유롭게 가져올 수 있습니다. 다만 특정 노드를 정확하게 추출하려면 XPath 문법을 이해하고 있어야 합니다. XPath는 XML 문서 안에서 요소(element)나 속성(attribute)을 탐색하기 위한 경로 표현식 언어로, 기본 문법은 W3Schools XPath 튜토리얼에서 자세히 배울 수 있습니다.
예제 XML 파일
설명을 위해 다음과 같은 구조의 XML 파일(my_file.xml)이 있다고 가정해 보겠습니다.
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
조건에 맞는 노드 추출하기
위 파일에서 lang 속성이 'en'인 모든 title 노드를 추출하고 싶다면, XPath 표현식을 findall() 메서드에 넘겨주면 됩니다.
from xml.etree import ElementTree
tree = ElementTree.parse('my_file.xml')
root = tree.getroot()
# lang 속성이 'en'인 모든 title 노드 찾기
for node in root.findall(".//title[@lang='en']"):
print(node.text)
실행 결과는 다음과 같습니다.
Everyday Italian
Harry Potter
코드 설명
.//title[@lang='en']: 루트 노드 아래의 모든 하위 계층에서 lang 속성값이 'en'인 title 요소를 의미합니다.findall(): 조건에 일치하는 모든 요소를 리스트로 반환합니다. 첫 번째 결과 하나만 필요하다면find()를 사용하는 것이 좋습니다.node.text: 해당 요소가 담고 있는 텍스트 내용을 반환합니다.
알아두면 좋은 팁
오래된 예제에서 종종 보이는 getchildren() 메서드는 Python 3.9부터 제거되었으며, XPath 경로는 반드시 .//처럼 상대 경로 형식으로 시작해야 한다는 점에 유의하세요. 또한 표준 라이브러리보다 강력한 XPath 기능이 필요하다면 lxml 라이브러리를 사용하는 것도 훌륭한 대안입니다.