IT Log

[Python] xml.etree.ElementTree (XML 구문 분석) 본문

Python

[Python] xml.etree.ElementTree (XML 구문 분석)

newly0513 2021. 6. 6. 16:26
728x90
반응형

xml.etree.ElementTree

 XML 데이터를 구문 분석하고 만들기 위한 단순하고 효율적인 API를 구현.

 


import xml.etree.ElementTree as ET

 

XML 데이터 가져오기

...
# XML파일 가져오기
tree = ET.parse('file_path')
...

 

최상위 경로 가져오기

...
# 최상위 Tag 가져오기 
root = tree.getroot()
...

 

문자열에서 XML 읽어오기

...
# 문자열 XML
xml_as_str = ''' <?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>
'''

# 문자열로된 XML 가져오기
tree = ET.fromstring(xml_as_str)
...

 

인덱스로 특정 노드 읽어오기

...
# 최상위 Tag에서 3번째 Tag의 text를 가져오기
root[0][2].text 
또는
# 최상위 Tag에서 2번째 Tag의 3번째 Tag명을 가져오기
root[0][1][2].tag
...

 

반복 구문 읽어오기

...
# root 하위에 child라는 Tag의 text를 출력
for child in root.iter('child'):
    print(child.text)
...

 

XML 파일에 namespace가 있는 경우

...
# namespace 등록
ns = {'name' : 'http://name.example.com', 'space' : 'http://space.example.com'}

name = root.findall('name:tag', ns)
space = root.findall('space:tag', ns)
...

 

XPath 사용하기

...
# 해당 경로에 'third' Tag 전부 찾기
root.findall("./first/second/third")

# 'second' Tag 하위에 name속성이 'abc'인 Tag 전부 찾기
root.findall(".//second/..[@name='abc']")

# name속성이 'abc'인 Tag 하위에 'third' Tag 전부 찾기
root.findall(".//*[@name='abc']/third")

# 2번쨰 'third' Tag 찾기
root.findall(".//third[1]")
...

 

XPath 구문

구문 의미
tag 주어진 tag가 있는 모든 하위 요소를 선택
* 모든 하위요소를 선택
. 현재 노드를 선택 (상대 경로)
// 현재 요소 아래의 모든 수준에서 모든 하위 요소 선택
.. 상위 요소를 선택
[@attrib] 주어진 속성을 가진 모든 요소를 선택
[@attrib='value'] 주어진 속성에 주어진 값이 이쓴 모든 요소를 선택
[tag] tag라는 자식이 있는 모든 요소를 선택. (직계만 가능)
[.='text'] 주어진 text를 포함한 하위 항목을 포함한 모든 요소를 선택
[tag='text'] 주어진 text를 포함한 tag라는 자식이 있는 모든 요소를 선택
[position] 주어진 위치에 있는 모든 요소를 선택. 앞에 태그 이름이 와야함
728x90
반응형

'Python' 카테고리의 다른 글

[Python] Remark (주석)  (0) 2021.06.06
[Python] Type Cast (타입 변환)  (0) 2021.06.06
[Python] package installation  (0) 2021.06.06
[Python] PyCharm Install  (0) 2021.06.06
[Python] Python Install  (0) 2021.06.06
Comments