Python
XML 요소 분석하기. (ElementTree)
개발자-H
2022. 3. 27. 15:48
XML은 데이터를 표현 하는 여러 방식 중 하나이다.
- 데이터 표현 방식으로 CSV, JSON과 같은 방식이 있다.
- XML은 하나의 텍스트 파일이며 원하는 데이터를 얻기 위해 파싱 및 가공의 과정을 거친다. (Deserialize)
- 다음의 XML에서 Member 객체를 파싱하여 데이터를 가공해보자.
<?xml version="1.0"?>
<doc>
<assembly>
<name>DocumentationApp</name>
</assembly>
<members>
<member name="M:StudyApp.Model.Book.#ctor(System.DateTime,StudyApp.Model.BookType,System.String)">
<summary>
책을 생성합니다.
1) 요약 1
2) 요약 2
3) 요약 3
4) 요약 4
5) 요약 5
</summary>
<param name="createdTime" type="DateTime">생성 일자</param>
<param name="type" type="BookType">종류</param>
<param name="title" type="string">이름</param>
<code>
var game = new Book(DateTime.Now, BookType.Game, "Diablo II");
var history = new Book(DateTime.Now, BookType.History, "Korea");
</code>
</member>
</members>
</doc>
- XML 파싱을 위해 lxml를 설치한다.
pip install lxml
- XML 텍스트 파일을 파싱한다.
from lxml import etree
import xml.etree.ElementTree as elemTree
parser = etree.XMLParser(remove_blank_text=True)
tree = elemTree.parse('docs.xml', parser=parser)
root = tree.getroot()
- XML 데이터 중 Member 요소를 가져온다.
for member_item in root.iter('member'):
# member 요소의 attribute 출력
print(member_item.attrib)
- Member 하위 요소 중 Summary 요소를 찾아 출력한다.
for member_item in root.iter('member'):
# member 요소의 attribute 출력
print(member_item.attrib)
for summary_item in member_item.findall('summary'):
print(summary_item.text)
# 결과
{'name': 'M:StudyApp.Model.Book.#ctor(System.DateTime,StudyApp.Model.BookType,System.String)'}
책을 생성합니다.
1) 요약 1
2) 요약 2
3) 요약 3
4) 요약 4
5) 요약 5
- 얻은 데이터의 공백 상태가 마음에 들지 않는다.
- strip()를 사용하여 공백 문자를 제거한다.
for member_item in root.iter('member'):
# member 요소의 attribute 출력
print(member_item.attrib)
for summary_item in member_item.findall('summary'):
# 문자열 후처리
for line in summary_item.text.splitlines():
print(line.strip())
{'name': 'M:StudyApp.Model.Book.#ctor(System.DateTime,StudyApp.Model.BookType,System.String)'}
책을 생성합니다.
1) 요약 1
2) 요약 2
3) 요약 3
4) 요약 4
5) 요약 5
- 각 요소의 Attribute 속성은 attrib 속성으로 iterable 할 수 있다.
for member_item in root.iter('member'):
for param_item in member_item.findall('param'):
for param_attribute_item in param_item.attrib:
print('name : ', param_attribute_item, 'type : ', param_item.attrib[param_attribute_item])
name : name type : createdTime
name : type type : DateTime
name : name type : type
name : type type : BookType
name : name type : title
name : type type : string