개발자-H 입니다.

XML 요소 분석하기. (ElementTree) 본문

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

 

 

Comments