Python - Xử lý XML

Chào bạn những người mơ ước trở thành lập trình viên! Hôm nay, chúng ta sẽ bơi lội vào thế giới thú vị của việc xử lý XML với Python. Là một giáo viên khoa học máy tính nhà附近的 bạn thân thiện, tôi rất mong đợi hướng dẫn bạn qua cuộc hành trình này. Vậy, hãy nhận một chén của đồ uống yêu thích của bạn, và hãy bắt đầu nào!

Python - XML Processing

XML là gì?

Trước khi nhảy vào phần mã, hãy hiểu rõ xem XML thực sự là gì. XML stands for eXtensible Markup Language (Ngôn ngữ Đánh dấu Mở Rộng). Nó giống như là chú của HTML, nhưng có mục đích khác. trong khi HTML được sử dụng để hiển thị dữ liệu, XML được sử dụng để lưu trữ và vận chuyển dữ liệu.

Hãy tưởng tượng XML như là một cách để tổ chức thông tin theo cấu trúc cây. Nó sử dụng thẻ (như <tag>) để định nghĩa các yếu tố, tương tự như cách bạn có thể tổ chức các tệp trong các thư mục trên máy tính của bạn.

Dưới đây là một ví dụ đơn giản về XML:

<bookstore>
<book>
<title>Harry Potter</title>
<author>J.K. Rowling</author>
<year>1997</year>
</book>
</bookstore>

Trong ví dụ này, chúng ta có một cửa hàng sách chứa thông tin về một cuốn sách. Cuốn sách có tựa đề, tác giả và năm xuất bản. Dễ peasy, phải không?

Kiến trúc và API của XML Parser

Bây giờ khi chúng ta biết XML là gì, hãy nói về cách chúng ta có thể làm việc với nó trong Python. Python cung cấp nhiều cách để phân tích (đọc và giải thích) dữ liệu XML. Ba cách chính là:

  1. SAX (Simple API for XML)
  2. DOM (Document Object Model)
  3. ElementTree

Mỗi một trong những cách này có ưu điểm và tình huống sử dụng riêng. Hãy khám phá chúng một!

Phân tích XML với API SAX

SAX, hoặc Simple API for XML, là một trình phân tích dựa trên sự kiện. Nó đọc tệp XML tuần tự và kích hoạt sự kiện khi gặp phải yếu tố, thuộc tính hoặc văn bản.

Dưới đây là một ví dụ đơn giản về sử dụng SAX trong Python:

import xml.sax

class BookHandler(xml.sax.ContentHandler):
def startElement(self, name, attrs):
self.current = name
def characters(self, content):
if self.current == "title":
print(f"Book title: {content}")

handler = BookHandler()
parser = xml.sax.make_parser()
parser.setContentHandler(handler)
parser.parse("books.xml")

Trong ví dụ này, chúng ta tạo một lớp BookHandler định nghĩa điều gì để làm khi trình phân tích gặp phải các phần khác nhau của XML. Khi nó tìm thấy yếu tố "title", nó in ra tựa đề.

Phân tích XML với API DOM

DOM, hoặc Document Object Model, tải toàn bộ tài liệu XML vào bộ nhớ và đại diện nó dưới dạng cấu trúc cây. Điều này cho phép bạn dễ dàng duyệt và thay đổi tài liệu.

Dưới đây là cách bạn có thể sử dụng DOM trong Python:

import xml.dom.minidom

doc = xml.dom.minidom.parse("books.xml")
titles = doc.getElementsByTagName("title")
for title in titles:
print(f"Book title: {title.firstChild.data}")

Đoạn mã này phân tích tệp XML, tìm tất cả các yếu tố "title" và in ra nội dung của chúng.

API XML ElementTree

ElementTree là một cách nhẹ và phức tạp hơn với Python để làm việc với XML. Nó thường là lựa chọn ưa thích của nhiều nhà phát triển Python nhờ đến tính đơn giản và hiệu quả của nó.

Dưới đây là một ví dụ sử dụng ElementTree:

import xml.etree.ElementTree as ET

tree = ET.parse("books.xml")
root = tree.getroot()

for book in root.findall("book"):
title = book.find("title").text
print(f"Book title: {title}")

Đoạn mã này làm cùng điều gì như các ví dụ trước đó, nhưng trong cách trực tiếp hơn.

Tạo một tệp XML

Bây giờ, hãy thử tạo một tệp XML từ đầu bằng cách sử dụng ElementTree:

import xml.etree.ElementTree as ET

root = ET.Element("bookstore")
book = ET.SubElement(root, "book")
ET.SubElement(book, "title").text = "The Hitchhiker's Guide to the Galaxy"
ET.SubElement(book, "author").text = "Douglas Adams"
ET.SubElement(book, "year").text = "1979"

tree = ET.ElementTree(root)
tree.write("new_books.xml")

Đoạn mã này tạo một tệp XML mới với một mục sách. Nó giống như là làm chủ tác giả, nhưng thay vì viết một cuốn sách, bạn đang viết XML!

Phân tích một tệp XML

Chúng ta đã đã thấy các ví dụ về việc phân tích tệp XML, nhưng hãy xem xét một ví dụ phần lớn hơn sử dụng ElementTree:

import xml.etree.ElementTree as ET

tree = ET.parse("books.xml")
root = tree.getroot()

for book in root.findall("book"):
title = book.find("title").text
author = book.find("author").text
year = book.find("year").text
print(f"'{title}' by {author}, published in {year}")

Đoạn mã này đọc tệp XML của chúng ta và in ra thông tin đã định dạng về mỗi cuốn sách.

Chỉnh sửa một tệp XML

Cuối cùng, hãy chỉnh sửa một tệp XML hiện có:

import xml.etree.ElementTree as ET

tree = ET.parse("books.xml")
root = tree.getroot()

for book in root.findall("book"):
year = int(book.find("year").text)
if year < 2000:
book.find("year").text = str(year + 100)

tree.write("modified_books.xml")

Đoạn mã này thêm 100 năm vào ngày xuất bản của bất kỳ cuốn sách nào được xuất bản trước năm 2000. Như thể chúng ta đang gửi các cuốn sách này đến tương lai!

Dưới đây là bảng tóm tắt các phương pháp chính chúng ta đã sử dụng:

Method Description
ET.parse() Phân tích một tệp XML
ET.Element() Tạo một yếu tố mới
ET.SubElement() Tạo một yếu tố con mới
element.findall() Tìm tất cả các yếu tố con phù hợp
element.find() Tìm yếu tố phù hợp đầu tiên
element.text Nhận hoặc đặt văn bản của yếu tố
tree.write() Ghi cây XML vào một tệp

Và đó là thế! Chúng ta đã bao gồm các khái niệm cơ bản về việc xử lý XML trong Python. Hãy nhớ, luyện tập sẽ làm bạn hoàn hảo, vì vậy đừng sợ thử nghiệm với các ví dụ này. XML có thể có vẻ quá khó khăn ban đầu, nhưng một khi bạn đã quen, bạn sẽ tìm thấy nó là một công cụ mạnh mẽ để làm việc với dữ liệu có cấu trúc.

Chúc mãi mãi lập trình, những người phụ trách XML tương lai! ??

Credits: Image by storyset