[xml] xml 파싱하기

2016. 2. 16. 17:55·python

파이썬에서 xml 을 파싱할때는

xml.etree.ElementTree 를 이용하여 진행한다.


주오 프로퍼티는 tag, attrib, text 가 있고,

주요 메소드는 iter(), findall() 이 있다.


활용 방법은 다음과 같다.



# -*- coding:utf-8 -*-
import xml.etree.ElementTree as ET

country_data_as_string = '''<?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>
    <city name="NewYork">
        <rank>1</rank>
        <year>2015</year>
        <neighbor name="boston" time="1993"/>
    </city>
    <city name="Boston">
        <rank>4</rank>
        <year>2015</year>
        <neighbor name="newyork" time="1992"/>
    </city>
</data>
'''

tree = ET.parse('test.xml')	#파일을 이용한 파싱
root = tree.getroot()

root = ET.fromstring(country_data_as_string)	# xml 문자를 이용한 파싱

print(root.tag, root.attrib)	# root 가 <data> 엘리먼트를 가르키게 된다. 
''' 
출력
('data', {})
'''

# root 태그로 for 문을 돌리면 자식 엘리먼트 전체가 추출 됨
for child in root:
	print(child.tag, child.attrib)
'''
출력
('country', {'name': 'Liechtenstein'})
('country', {'name': 'Singapore'})
('country', {'name': 'Panama'})
('city', {'name': 'NewYork'})
('city', {'name': 'Boston'})
'''

# iter() 메소드를 이용하면 xml 문서 전체의 엘리먼트를 가지고 온다.
for neighbor in root.iter('neighbor'):
	print(neighbor.tag, neighbor.attrib)
'''
출력
('neighbor', {'direction': 'E', 'name': 'Austria'})
('neighbor', {'direction': 'W', 'name': 'Switzerland'})
('neighbor', {'direction': 'N', 'name': 'Malaysia'})
('neighbor', {'direction': 'W', 'name': 'Costa Rica'})
('neighbor', {'direction': 'E', 'name': 'Colombia'})
('neighbor', {'name': 'boston', 'time': '1993'})
('neighbor', {'name': 'newyork', 'time': '1992'})
'''

# findall() 메소드를 이용하면 현재 태그의 자식중에서 지정한 태그를 반환한다. 
for neighbor in root.findall('neighbor'):
	print(neighbor.tag)
'''
출력
없음
'''
for country in root.findall('country'):
	print(country.tag, country.attrib)
'''
출력
('country', {'name': 'Liechtenstein'})
('country', {'name': 'Singapore'})
('country', {'name': 'Panama'})
'''

# xpath 를 이용하여 데이터를 확인하는 것도 가능
for ele in root.findall("./country/year"):
	print(ele.tag, ele.text)
'''
출력
('year', '2008')
('year', '2011')
('year', '2011')
'''


# 인덱스를 이용하여 태그를 지정하는 것도 가능
print(root[2][1].tag, root[2][1].text)	
'''
출력
('year', '2011')
'''
반응형
저작자표시 비영리 (새창열림)

'python' 카테고리의 다른 글

[os] 디렉토리의 특정파일의 파일명 변경하기  (0) 2016.03.23
[urllib / http]http로 웹에서 파일 다운로드 하기  (3) 2016.03.05
[python][xlswriter] xlsxwriter 를 이용하여 엑셀 문서 생성  (0) 2016.01.20
SyntaxError: Non-ASCII character 해결하기  (0) 2016.01.20
pip의 패키지 업그레이드 하기  (0) 2016.01.20
'python' 카테고리의 다른 글
  • [os] 디렉토리의 특정파일의 파일명 변경하기
  • [urllib / http]http로 웹에서 파일 다운로드 하기
  • [python][xlswriter] xlsxwriter 를 이용하여 엑셀 문서 생성
  • SyntaxError: Non-ASCII character 해결하기
hs_seo
hs_seo
Hello World!
    반응형
  • hs_seo
    개발자로 살아남기
    hs_seo
  • 전체
    오늘
    어제
    • 전체 (1140)
      • 개발자 (21)
        • 개발에 유의할 점 (0)
        • 면접 (5)
      • IT 소식 (5)
        • 업계 (1)
      • java (51)
        • 디자인패턴 (3)
        • apache-common (1)
      • 개념 (47)
        • 자료구조 (4)
        • 함수형사고 (8)
        • 디자인패턴 (1)
      • 데이터분석 (1)
      • python (67)
        • 코드조각 (12)
        • 라이브러리 (2)
      • 빅데이터 (418)
        • zookeeper (5)
        • hadoop (78)
        • hdfs (12)
        • hive (127)
        • hbase (16)
        • spark (40)
        • scala (4)
        • trino (3)
        • oozie (41)
        • Hue (9)
        • R (5)
        • sqoop (6)
        • flume (3)
        • elasticsearch (2)
        • airflow (16)
        • kafka (3)
        • kubernetes (10)
        • openstack (3)
        • flink (2)
        • redis (2)
      • 빅데이터 강좌 (2)
      • 알고리즘 (131)
        • 알고리즘 (1)
        • 백준 (61)
        • 정올 (41)
        • 더블릿 (5)
        • 프로그래머스 (1)
      • 프로그래밍 언어 (30)
        • go (4)
        • js (9)
        • .Net (6)
        • Jsp (1)
        • ansible (3)
        • terraform (6)
      • Tools (56)
        • docker (2)
        • macbook (6)
        • maven (3)
        • sublime (1)
      • 프레임워크 (25)
        • [JS] angularjs (2)
        • [JS] node.js (19)
        • [Java] spring (2)
        • Android (2)
      • 데이타베이스 (43)
        • SQLD (5)
        • Oracle (1)
        • MySQL (8)
        • ADsP (2)
      • 리눅스 (25)
        • Bash (61)
      • GCP (5)
      • AWS (34)
        • EC2 (2)
        • EMR (14)
      • 정보보안기사 (4)
        • 네트워크 (1)
      • 개인 (80)
        • 업무실수 (0)
        • 책 (9)
        • 교육 (3)
        • 여행 (17)
        • 영화 (12)
        • 음악 (2)
        • 피규어 (4)
        • 게임 (3)
        • 생각 (7)
        • 기타 (10)
        • 좋은글 (5)
        • 좋은 사이트 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

    • 빅데이터-하둡,하이브로 시작하기
    • 빅데이터-스칼라, 스파크로 시작하기
    • Kaggle에서 파이썬으로 데이터 분석 시작하기
    • 쉘스크립트 개발 시작하기
    • 개발자가 데이터 분석 준전문가 되기
    • 데브쿠마
  • 공지사항

  • 인기 글

  • 태그

    S3
    hbase
    정올
    ubuntu
    k8s
    AWS
    Hadoop
    nodejs
    하둡
    HDFS
    백준
    mysql
    yarn
    SPARK
    emr
    다이나믹
    파이썬
    java
    bash
    하이브
    airflow
    HIVE
    build
    error
    oozie
    Python
    Linux
    오류
    Tez
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
hs_seo
[xml] xml 파싱하기
상단으로

티스토리툴바