Computer >> Máy Tính >  >> Lập trình >> Python

API ElementTree XML bằng Python

Ngôn ngữ đánh dấu có thể mở rộng (XML) là một ngôn ngữ đánh dấu giống như HTML. Nó là một thiết bị di động và rất hữu ích để xử lý lượng dữ liệu vừa và nhỏ mà không cần sử dụng bất kỳ cơ sở dữ liệu SQL nào.

Thư viện chuẩn của Python chứa gói xml. Gói này có mô-đun ElementTree. Đây là một API bộ xử lý XML đơn giản và nhẹ.

XML là một dạng cây giống như định dạng dữ liệu phân cấp. 'ElementTree' trong mô-đun này coi toàn bộ tài liệu XML như một cây. lớp 'Phần tử' đại diện cho một nút duy nhất trong cây này. Các thao tác đọc và ghi trên tệp XML được thực hiện ở cấp ElementTree. Tương tác với một phần tử XML duy nhất và các phần tử con của nó được thực hiện ở cấp Phần tử.

Để tạo tệp XML

Cây là một cấu trúc phân cấp của các phần tử bắt đầu bằng gốc, sau đó là các phần tử khác. Mỗi phần tử được tạo bằng cách sử dụng hàm Element () của mô-đun này.

import xml.etree.ElementTree as et
e=et.Element('name')

Mỗi phần tử được đặc trưng bởi một thẻ và thuộc tính thuộc tính là một đối tượng dict. Đối với phần tử bắt đầu của cây, thuộc tính là một từ điển trống

>>> root=xml.Element('employees')
>>> root.tag
'emploees'
>>> root.attrib
{}

Bây giờ bạn có thể thiết lập một hoặc nhiều phần tử con được thêm vào bên dưới phần tử gốc. Mỗi đứa trẻ có thể có một hoặc nhiều thành phần phụ. Thêm chúng bằng cách sử dụng hàm Subelement () và xác định thuộc tính văn bản của nó.

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

Mỗi con được thêm vào root bằng hàm append () như

root.append(child)

Sau khi thêm số lượng phần tử con cần thiết, hãy xây dựng một đối tượng cây bằng hàm elementTree ()

tree = et.ElementTree(root)

Toàn bộ cấu trúc cây được ghi vào tệp nhị phân bằng hàm write () của đối tượng cây

f = open('employees.xml', "wb")
tree.write(f)

Trong ví dụ sau, cây được xây dựng ngoài danh sách các mục từ điển. Mỗi mục từ điển chứa các cặp khóa-giá trị mô tả cấu trúc dữ liệu sinh viên. Cây được xây dựng như vậy được viết thành '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' được lưu trữ trong thư mục làm việc hiện tại.

<employees><employee><name>aaa</name><age>21</age><sal>5000</sal></employee><employee><name>xyz</name><age>22</age><sal>60</sal></employee></employee>

Để phân tích cú pháp tệp XML

Bây giờ chúng ta hãy đọc lại 'myfile.xml' được tạo trong ví dụ trên. Vì mục đích này, các chức năng sau trong mô-đun ElementTree sẽ được sử dụng

ElementTree () Hàm này được nạp chồng để đọc cấu trúc phân cấp của các phần tử đối với một đối tượng cây.

tree = et.ElementTree(file='students.xml')

getroot () Hàm này trả về phần tử gốc của cây

root = tree.getroot()

getchildren () Hàm này trả về danh sách các phần tử con thấp hơn một cấp của một phần tử.

children = root.getchildren()

Trong ví dụ sau, các phần tử và phần tử con của 'myfile.xml' được phân tích cú pháp thành một danh sách các mục từ điển.

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)

Đầu ra

[{'name': 'aaa', 'age': '21', 'sal': '5000'}, {'name': 'xyz', 'age': '22', 'sal': '6000'}]

Để sửa đổi tệp XML

Chúng ta sẽ sử dụng hàm iter () của Element. Nó tạo một trình lặp cây cho thẻ đã cho với phần tử hiện tại là gốc. Trình lặp lặp qua phần tử này và tất cả các phần tử bên dưới nó, theo thứ tự tài liệu (độ sâu đầu tiên).

Hãy để chúng tôi tạo trình lặp cho tất cả các thành phần phụ 'mark' và văn bản tăng dần của mỗi thẻ sal lên 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)

Giờ đây, 'worker.xml' của chúng tôi sẽ được sửa đổi cho phù hợp.

Chúng tôi cũng có thể sử dụng set () để cập nhật giá trị của một khóa nhất định.

x.set(marks, str(mark))