본문 바로가기

라이브러리

[파이썬] XML 파싱, 수정, 생성 하기

Python에서 XML을 파싱하는 방법은 여러 가지가 있지만, 가장 일반적인 방법은 ElementTree 라이브러리를 사용하는 것입니다. ElementTree는 XML 문서를 파싱하고 조작하기 위한 파이썬 표준 라이브러리입니다.


1. XML 파싱

 

import xml.etree.ElementTree as ET

# XML 문자열을 파싱합니다.
xml_string = """
<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <book category="children">
    <title lang="en">Harry Potter</title>
    <author>J.K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
</bookstore>
"""

# 파싱합니다.
root = ET.fromstring(xml_string)

# 모든 책 정보를 출력합니다.
for book in root.findall('book'):
    title = book.find('title').text
    author = book.find('author').text
    year = book.find('year').text
    price = book.find('price').text
    print(title, author, year, price)


위 코드에서는 ElementTree 라이브러리의 ET.fromstring() 메서드를 사용하여 XML 문자열을 파싱하고, root 변수에 결과를 저장합니다. 이후, root.findall() 메서드를 사용하여 "book" 요소를 모두 찾고, 각각의 "book" 요소에서 "title", "author", "year", "price" 요소를 찾아 출력합니다.

find() 메서드를 사용하여 요소를 찾을 때, 요소의 태그 이름을 문자열로 지정하면 됩니다. 또한, text 속성을 사용하여 요소의 텍스트 내용을 가져올 수 있습니다.


2. XML 생성

 

import xml.etree.ElementTree as ET

# 루트 요소를 생성합니다.
root = ET.Element("bookstore")

# 자식 요소를 생성합니다.
book1 = ET.SubElement(root, "book")
book2 = ET.SubElement(root, "book")

# 자식 요소에 속성을 추가합니다.
book1.set("category", "cooking")
book2.set("category", "children")

# 자식 요소에 하위 요소를 추가합니다.
title1 = ET.SubElement(book1, "title")
title1.text = "Everyday Italian"
title2 = ET.SubElement(book2, "title")
title2.text = "Harry Potter"

# 생성된 XML을 파일에 씁니다.
tree = ET.ElementTree(root)
tree.write("bookstore.xml")


위 코드에서는 Element() 함수를 사용하여 루트 요소를 생성하고, SubElement() 함수를 사용하여 자식 요소를 생성합니다. set() 메서드를 사용하여 자식 요소에 속성을 추가하고, text 속성을 사용하여 자식 요소에 텍스트 내용을 추가합니다.

마지막으로, ElementTree() 함수를 사용하여 ElementTree 객체를 생성하고, write() 메서드를 사용하여 생성된 XML을 파일에 씁니다.

 

3. XML 수정

 

import xml.etree.ElementTree as ET

# XML 파일을 로드합니다.
tree = ET.parse("bookstore.xml")
root = tree.getroot()

# 새로운 요소를 추가합니다.
book3 = ET.Element("book")
book3.set("category", "travel")
title3 = ET.SubElement(book3, "title")
title3.text = "Around the World in 80 Days"
root.append(book3)

# 요소를 수정합니다.
for book in root.findall("book"):
    if book.get("category") == "cooking":
        price = book.find("price")
        price.text = "35.00"
        price.set("currency", "USD")

# 수정된 XML을 파일에 씁니다.
tree.write("bookstore.xml")


위 코드에서는 parse() 함수를 사용하여 기존의 XML 파일을 로드하고, getroot() 메서드를 사용하여 루트 요소를 가져옵니다. 이후, Element() 함수를 사용하여 새로운 요소를 생성하고, set() 메서드와 SubElement() 함수를 사용하여 속성과 하위 요소를 추가합니다.

요소를 수정할 때는, findall() 메서드를 사용하여 수정할 요소를 모두 찾은 후, find() 메서드를 사용하여 하위 요소를 찾고, text 속성과 set() 메서드를 사용하여 텍스트 내용과 속성을 수정합니다.

마지막으로, write() 메서드를 사용하여 수정된 XML을 파일에 씁니다.