Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python의 ElementTree XML API

<시간/>

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))