XML(Extensible Markup Language)은 HTML과 매우 유사한 마크업 언어입니다. 휴대용이며 SQL 데이터베이스를 사용하지 않고 중소량의 데이터를 처리하는 데 유용합니다.
Python의 표준 라이브러리에는 xml 패키지가 포함되어 있습니다. 이 패키지에는 ElementTree 모듈이 있습니다. 이것은 간단하고 가벼운 XML 프로세서 API입니다.
XML은 계층적 데이터 형식과 같은 트리입니다. 이 모듈의 'ElementTree'는 전체 XML 문서를 트리로 취급합니다. 'Element' 클래스는 이 트리의 단일 노드를 나타냅니다. XML 파일에 대한 읽기 및 쓰기 작업은 ElementTree 수준에서 수행됩니다. 단일 XML 요소 및 해당 하위 요소와의 상호 작용은 요소 수준에서 수행됩니다.
XML 파일 생성하기
트리는 루트로 시작하여 다른 요소가 뒤따르는 요소의 계층적 구조입니다. 각 요소는 이 모듈의 Element() 함수를 사용하여 생성됩니다.
import xml.etree.ElementTree as et e=et.Element('name')
각 요소는 dict 객체인 tag와 attrib 속성을 특징으로 합니다. 트리 시작 요소의 경우 attrib는 빈 사전입니다.
>>> root=xml.Element('employees') >>> root.tag 'emploees' >>> root.attrib {}
이제 루트 요소 아래에 추가할 하나 이상의 자식 요소를 설정할 수 있습니다. 각 자식은 하나 이상의 하위 요소를 가질 수 있습니다. Subelement() 함수를 사용하여 추가하고 텍스트 속성을 정의합니다.
child=xml.Element("employee") nm = xml.SubElement(child, "name") nm.text = student.get('name') age = xml.SubElement(child, "salary") age.text = str(student.get('salary'))
각 자식은 다음과 같이 append() 함수에 의해 루트에 추가됩니다.
root.append(child)
필요한 수만큼 자식 요소를 추가한 후 elementTree() 함수로 트리 객체를 생성합니다.
tree = et.ElementTree(root)
전체 트리 구조는 트리 객체의 write() 함수에 의해 바이너리 파일에 기록됩니다.
f = open('employees.xml', "wb") tree.write(f)
다음 예제에서 트리는 사전 항목 목록으로 구성됩니다. 각 사전 항목에는 학생 데이터 구조를 설명하는 키-값 쌍이 있습니다. 이렇게 구성된 트리는 'myfile.xml'에 기록됩니다.
import xml.etree.ElementTree as et employees=[{'name':'aaa','age':21,'sal':5000},{'name':xyz,'age':22,'sal':6000}] root = et.Element("employees") for employee in employees: child=xml.Element("employee") root.append(child) nm = xml.SubElement(child, "name") nm.text = student.get('name') age = xml.SubElement(child, "age") age.text = str(student.get('age')) sal=xml.SubElement(child, "sal") sal.text=str(student.get('sal')) tree = et.ElementTree(root) with open('employees.xml', "wb") as fh: tree.write(fh)
'myfile.xml'은 현재 작업 디렉토리에 저장됩니다.
<employees><employee><name>aaa</name><age>21</age><sal>5000</sal></employee><employee><name>xyz</name><age>22</age><sal>60</sal></employee></employee>
XML 파일을 구문 분석하려면
이제 위의 예제에서 생성된 'myfile.xml'을 다시 읽어봅시다. 이를 위해 ElementTree 모듈의 다음 기능이 사용됩니다.
요소 트리() 이 함수는 요소의 계층 구조를 트리 개체로 읽도록 오버로드됩니다.
tree = et.ElementTree(file='students.xml')
getroot() 이 함수는 트리의 루트 요소를 반환합니다.
root = tree.getroot()
getchildren() 이 함수는 요소의 한 수준 아래에 있는 하위 요소 목록을 반환합니다.
children = root.getchildren()
다음 예에서 'myfile.xml'의 요소 및 하위 요소는 사전 항목 목록으로 구문 분석됩니다.
import xml.etree.ElementTree as et tree = et.ElementTree(file='employees.xml') root = tree.getroot() students = [] children = root.getchildren() for child in children: employee={} pairs = child.getchildren() for pair in pairs: employee[pair.tag]=pair.text employees.append(student) print (employees)
출력
[{'name': 'aaa', 'age': '21', 'sal': '5000'}, {'name': 'xyz', 'age': '22', 'sal': '6000'}]
XML 파일을 수정하려면
Element의 iter() 함수를 사용하겠습니다. 현재 요소를 루트로 사용하여 주어진 태그에 대한 트리 반복자를 생성합니다. 반복자는 이 요소와 그 아래의 모든 요소를 문서(깊이 우선) 순서로 반복합니다.
모든 '표시' 하위 요소에 대한 반복기를 만들고 각 sal 태그의 텍스트를 100씩 증가시키도록 합시다.
import xml.etree.ElementTree as et tree = et.ElementTree(file='students.xml') root = tree.getroot() for x in root.iter('sal'): s = int (x.text) s = s+100 x.text=str(s) with open("employees.xml", "wb") as fh: tree.write(fh)
이제 'employees.xml'이 그에 따라 수정됩니다.
set()을 사용하여 특정 키의 값을 업데이트할 수도 있습니다.
x.set(marks, str(mark))