Độ bền dữ liệu Python - Trình phân tích cú pháp XML
XML là từ viết tắt của eXtensible Markup Language. Nó là một ngôn ngữ di động, mã nguồn mở và đa nền tảng rất giống HTML hoặc SGML và được World Wide Web Consortium khuyến nghị.
Đây là một định dạng trao đổi dữ liệu nổi tiếng, được sử dụng bởi một số lượng lớn các ứng dụng như dịch vụ web, công cụ văn phòng và Service Oriented Architectures(SOA). Định dạng XML có thể đọc được bằng máy và con người có thể đọc được.
Gói xml của thư viện Python tiêu chuẩn bao gồm các mô-đun sau để xử lý XML:
Sr.No. | Mô-đun & Mô tả |
---|---|
1 | xml.etree.ElementTree API ElementTree, một bộ xử lý XML đơn giản và nhẹ |
2 | xml.dom định nghĩa API DOM |
3 | xml.dom.minidom triển khai DOM tối thiểu |
4 | xml.sax Triển khai giao diện SAX2 |
5 | xml.parsers.expat ràng buộc phân tích cú pháp người nước ngoài |
Dữ liệu trong tài liệu XML được sắp xếp theo định dạng phân cấp giống như cây, bắt đầu bằng gốc và các phần tử. Mỗi phần tử là một nút duy nhất trong cây và có một thuộc tính nằm trong các thẻ <> và </>. Một hoặc nhiều phần tử con có thể được gán cho mỗi phần tử.
Sau đây là một ví dụ điển hình của tài liệu XML:
<?xml version = "1.0" encoding = "iso-8859-1"?>
<studentlist>
<student>
<name>Ratna</name>
<subject>Physics</subject>
<marks>85</marks>
</student>
<student>
<name>Kiran</name>
<subject>Maths</subject>
<marks>100</marks>
</student>
<student>
<name>Mohit</name>
<subject>Biology</subject>
<marks>92</marks>
</student>
</studentlist>
Trong khi sử dụng ElementTree, bước đầu tiên là thiết lập phần tử gốc của cây. Mỗi Phần tử có một thẻ và thuộc tính là một đối tượng dict. Đối với phần tử gốc, quy tắc là một từ điển trống.
import xml.etree.ElementTree as xmlobj
root=xmlobj.Element('studentList')
Bây giờ, chúng ta có thể thêm một hoặc nhiều phần tử dưới phần tử gốc. Mỗi đối tượng phần tử có thể cóSubElements. Mỗi thành phần con có một thuộc tính và thuộc tính văn bản.
student=xmlobj.Element('student')
nm=xmlobj.SubElement(student, 'name')
nm.text='name'
subject=xmlobj.SubElement(student, 'subject')
nm.text='Ratna'
subject.text='Physics'
marks=xmlobj.SubElement(student, 'marks')
marks.text='85'
Phần tử mới này được nối vào thư mục gốc bằng phương thức append ().
root.append(student)
Nối nhiều phần tử như mong muốn bằng phương pháp trên. Cuối cùng, đối tượng phần tử gốc được ghi vào một tệp.
tree = xmlobj.ElementTree(root)
file = open('studentlist.xml','wb')
tree.write(file)
file.close()
Bây giờ, chúng ta xem cách phân tích cú pháp tệp XML. Đối với điều đó, xây dựng cây tài liệu với tên của nó làm tham số tệp trong phương thức khởi tạo ElementTree.
tree = xmlobj.ElementTree(file='studentlist.xml')
Đối tượng cây có getroot() phương thức để lấy phần tử gốc và getchildren () trả về danh sách các phần tử bên dưới nó.
root = tree.getroot()
children = root.getchildren()
Một đối tượng từ điển tương ứng với mỗi phần tử con được xây dựng bằng cách lặp qua tập hợp phần tử con của mỗi nút con.
for child in children:
student={}
pairs = child.getchildren()
for pair in pairs:
product[pair.tag]=pair.text
Mỗi từ điển sau đó được nối vào một danh sách trả về danh sách ban đầu của các đối tượng từ điển.
SAXlà một giao diện tiêu chuẩn để phân tích cú pháp XML theo hướng sự kiện. Phân tích cú pháp XML với SAX yêu cầu ContentHandler bằng cách phân lớp con xml.sax.ContentHandler. Bạn đăng ký các cuộc gọi lại cho các sự kiện quan tâm và sau đó, để trình phân tích cú pháp tiếp tục thông qua tài liệu.
SAX hữu ích khi tài liệu của bạn lớn hoặc bạn có giới hạn về bộ nhớ vì nó phân tích cú pháp tệp khi đọc từ đĩa vì vậy toàn bộ tệp không bao giờ được lưu trữ trong bộ nhớ.
Mô hình Đối tượng Tài liệu
API (DOM) là một khuyến nghị của World Wide Web Consortium. Trong trường hợp này, toàn bộ tệp được đọc vào bộ nhớ và được lưu trữ ở dạng phân cấp (dựa trên cây) để thể hiện tất cả các tính năng của một tài liệu XML.
SAX, không nhanh như DOM, với các tệp lớn. Mặt khác, DOM có thể giết tài nguyên, nếu được sử dụng trên nhiều tệp nhỏ. SAX ở chế độ chỉ đọc, trong khi DOM cho phép thay đổi tệp XML.