Python - XML 처리
안녕하세요, 자신감 넘치는 프로그래머 여러분! 오늘은 Python을 사용한 흥미로운 XML 처리의 세계로 몸을 던지겠습니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 여러분을 이 여정을 안내하게 되어 기쁩니다. 그럼, 좋아하는 음료수 한 잔을 들고 시작해보겠습니다!
XML은 무엇인가요?
코딩 부분에 들어가기 전에, XML이란 정확히 무엇인지 이해해보겠습니다. XML은 eXtensible Markup Language의 약자입니다. HTML과 친척이지만, 다른 목적을 가지고 있습니다. HTML은 데이터를 표시하는 데 사용되는 반면, XML은 데이터를 저장하고 전송하는 데 사용됩니다.
XML을 컴퓨터에서 파일을 폴더에 정리하는 것과 비슷하게 정보를 트리 구조로 정리하는 방법으로 생각해보세요. 그리고 <tag>
과 같은 태그를 사용하여 요소를 정의합니다.
다음은 XML의 간단한 예입니다:
<bookstore>
<book>
<title>Harry Potter</title>
<author>J.K. Rowling</author>
<year>1997</year>
</book>
</bookstore>
이 예제에서, 우리는 책의 정보를 포함하는 책가게가 있습니다. 이 책은 제목, 저자, 발행 연도를 가지고 있습니다. 쉽죠?
XML 파서 아키텍처와 API
이제 XML이 무엇인지 알았으니, Python에서 어떻게 작업할 수 있는지 이야기해보겠습니다. Python은 XML 데이터를 구문 분석(읽고 해석)하는 데 여러 가지 방법을 제공합니다. 주요的三가지 접근 방식은 다음과 같습니다:
- SAX (Simple API for XML)
- DOM (Document Object Model)
- ElementTree
이 각각은 자신의 강점과 사용 사례가 있습니다. 하나씩 탐구해보겠습니다!
SAX API로 XML 구문 분석
SAX는 이벤트 기반 파서입니다. XML 파일을 순차적으로 읽고, 요소, 속성, 텍스트를 만나면 이벤트를 触发합니다.
다음은 SAX를 Python에서 사용하는 간단한 예입니다:
import xml.sax
class BookHandler(xml.sax.ContentHandler):
def startElement(self, name, attrs):
self.current = name
def characters(self, content):
if self.current == "title":
print(f"Book title: {content}")
handler = BookHandler()
parser = xml.sax.make_parser()
parser.setContentHandler(handler)
parser.parse("books.xml")
이 예제에서, 우리는 BookHandler
클래스를 생성하여 파서가 XML의 다른 부분을 만나면 무엇을 할지 정의합니다. "title" 요소를 찾으면 제목을 인쇄합니다.
DOM API로 XML 구문 분석
DOM은 전체 XML 문서를 메모리에 로드하고 트리 구조로 나타내는 Document Object Model입니다. 이를 통해 문서를 쉽게 탐색하고 수정할 수 있습니다.
DOM을 Python에서 사용하는 방법은 다음과 같습니다:
import xml.dom.minidom
doc = xml.dom.minidom.parse("books.xml")
titles = doc.getElementsByTagName("title")
for title in titles:
print(f"Book title: {title.firstChild.data}")
이 코드는 XML 파일을 구문 분석하고, 모든 "title" 요소를 찾아서 내용을 인쇄합니다.
ElementTree XML API
ElementTree는 더 가볍고 더 Pythonic한 방법으로 XML을 작업할 수 있습니다. 간단성과 효율성 때문에 많은 Python 개발자들이 선호하는 선택입니다.
ElementTree를 사용하는 예제는 다음과 같습니다:
import xml.etree.ElementTree as ET
tree = ET.parse("books.xml")
root = tree.getroot()
for book in root.findall("book"):
title = book.find("title").text
print(f"Book title: {title}")
이 코드는 앞의 예제와 같은 작업을 더 간단하게 수행합니다.
XML 파일 생성
이제 ElementTree를 사용하여 새 XML 파일을 생성해보겠습니다:
import xml.etree.ElementTree as ET
root = ET.Element("bookstore")
book = ET.SubElement(root, "book")
ET.SubElement(book, "title").text = "The Hitchhiker's Guide to the Galaxy"
ET.SubElement(book, "author").text = "Douglas Adams"
ET.SubElement(book, "year").text = "1979"
tree = ET.ElementTree(root)
tree.write("new_books.xml")
이 스크립트는 책 항목을 포함한 새 XML 파일을 생성합니다. 책을 쓰는 것과는 달리 XML을 쓰는 것과 같습니다!
XML 파일 구문 분석
이미 XML 파일을 구문 분석하는 예제를 본 적이 있지만, ElementTree를 사용한 더 포괄적인 예제를 살펴보겠습니다:
import xml.etree.ElementTree as ET
tree = ET.parse("books.xml")
root = tree.getroot()
for book in root.findall("book"):
title = book.find("title").text
author = book.find("author").text
year = book.find("year").text
print(f"'{title}' by {author}, published in {year}")
이 스크립트는 XML 파일을 읽고 각 책에 대한 형식화된 정보를 인쇄합니다.
XML 파일 수정
마지막으로, 기존 XML 파일을 수정해보겠습니다:
import xml.etree.ElementTree as ET
tree = ET.parse("books.xml")
root = tree.getroot()
for book in root.findall("book"):
year = int(book.find("year").text)
if year < 2000:
book.find("year").text = str(year + 100)
tree.write("modified_books.xml")
이 스크립트는 2000년 이전에 발행된 책의 발행 연도에 100년을 더합니다. 이 책들을 미래로 보내는 것과 같네요!
다음은 우리가 사용한 주요 메서드를 요약한 표입니다:
메서드 | 설명 |
---|---|
ET.parse() |
XML 파일을 구문 분석 |
ET.Element() |
새 요소를 생성 |
ET.SubElement() |
새 하위 요소를 생성 |
element.findall() |
일치하는 하위 요소를 모두 찾기 |
element.find() |
첫 번째 일치하는 하위 요소 찾기 |
element.text |
요소의 텍스트를 가져오거나 설정 |
tree.write() |
XML 트리를 파일에 쓰기 |
그리고 이렇게 끝납니다! 우리는 Python에서 XML 처리의 기본을 다루었습니다. 기억하세요, 연습이 실력을 만든다는 말이 있습니다. 이러한 예제들을 실험해보세요. XML은 처음에는 좀 두려울 수 있지만, 익숙해지면 구조화된 데이터를 작업하는 데 강력한 도구라는 것을 알게 될 거예요.
코딩을 즐기세요, 미래의 XML 마스터들! ??
Credits: Image by storyset