Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

에코프로.AI

[Python] XML 데이터 처리관련 본문

AI Tutorial

[Python] XML 데이터 처리관련

AI_HitchHiker 2024. 8. 18. 11:32

XML 데이터

 

XML이란?

  • XML(eXtensible Markup Language)는 데이터를 구조화하고 저장하기 위한 마크업 언어
    • 데이터 교환에 대한 표준
    • HTML과 유사하지만, 데이터의 표현에 중점을 두고 있음
  • 특징
    • 유연성
      • 사용자 정의 태그를 사용하여 데이터를 표현할 수 있음
    • 가독성
      • 사람이 읽고 쓸 수 있는 형태로 데이터를 표현
    • 데이터 교환
      • 다양한 시스템 간에 데이터 교환을 용이하게 함

XML의 구조와 문법

  • XML의 주요 요소
    • 루트 엘리먼트 : 모든 XML 문서에는 단 하나의 루트 앨리먼트가 있어야 함.
    • 자식 엘리먼트 : 루트 엘리먼트 내에 포함된 엘리먼트
    • 텍스트 노드 : 엘리먼트 내의 텍스트

XML 데이터 읽기/쓰기

  • sample.xml
<?xml version="1.0" encoding="utf-8"?>
<customers>
<customer>
<name>홍길동</name>
<address>서울 강남구</address>
</customer>
<customer>
<name>고길동</name>
<address>서울 강북구</address>
</customer>
<customer>
<name>김길동</name>
<address>서울 서초구</address>
</customer>
</customers>

파이썬 표준 라이브러리 xml 모듈

import xml.etree.ElementTree as ET
  • 검색하기
    • find(path)
      • 첫 번째 요소반환
    • findall(path)
      • 모든 요소 반환
    • findtext(path)
      • 첫 번째 요소의 텍스트 반환
    • path 스트링
      • ./name
        • 현재 노드의 바로 아래 자식 중에서  'name' 검색
      • .//name
        • 현재 노드의 모든 하위 경로에서 'name' 검색

  • string 으로부터  XML 데이터 읽기
root = ET.fromstring(xml_data)
print(ET.tostring(root, encoding='utf-8').decode('utf-8'))
root = ET.fromstring(xml_data)
print(f'루트 엘리먼트 : {root.tag}')

for child in root:
  print(child.tag)
  for item in child:
    print(f'{item.tag} : {item.text}')

 

  • XML 파일로부터 데이터 읽기
tree = ET.parse('sample.xml')

root = tree.getroot()

print(f'루트 엘리먼트 : {root.tag}')

for child in root:
  print(child.tag)
  for item in child:
    print(f'{item.tag} : {item.text}')

 

  • XML 파일 저장하기
root = ET.Element('customers')
customer = ET.SubElement(root, 'customer')
name = ET.SubElement(customer, 'name')
name.text = '홍길동'
address = ET.SubElement(customer, 'address')
address.text = '서울 강남구'
customer = ET.SubElement(root, 'customer')
name = ET.SubElement(customer, 'name')
name.text = '고길동'
address = ET.SubElement(customer, 'address')
address.text = '서울 강북구'


tree = ET.ElementTree(root)
tree.write('output.xml', encoding='utf-8', xml_declaration=True)

lxml라이브러리

  • 매우 빠른 파싱 속도를 제공하고, 대규모  XML 문서처리에 적합
  • 설치
pip install lxml

 

 


  • 라이브러리 불러오기
from lxml import etree
  • 문자열로 부터 데이터 읽기
from lxml import etree

root = etree.fromstring(xml_data)
print(f'루트 엘리먼트 : {root.tag}')

for child in root:
  print(child.tag)
  for item in child:
    print(f'{item.tag} : {item.text}')
  • 파일로부터 XML파일 읽기
tree = etree.parse('sample.xml')

root = tree.getroot()
print(f'루트 엘리먼트 : {root.tag}')

for child in root:
  print(child.tag)
  for item in child:
    print(f'{item.tag} : {item.text}')
name = root.find('.//name')
print(name)
print(f'{name.tag}:{name.text}')

name2 = root.findtext('.//name')
print(name2)
names = root.findall('.//name')
print(names)
print('len : ', len(names))
for name in names:
    print(type(name))
    print(f'{name.tag}:{name.text}')

 

  • XML 파일에 쓰기
new_customer = etree.Element('customer')
name = etree.SubElement(new_customer, 'name')
name.text = '고길동'
address = etree.SubElement(new_customer, 'address')
address.text = '서울 강북구'

root.append(new_customer)

tree.write('modified_sample.xml', encoding='UTF-8', xml_declaration=True)