Xử lý XML trong Python: Tạo và Thao tác Tài liệu

XML là chuẩn giao thức trao đổi dữ liệu giữa các hệ thống khác ngôn ngữ, tương tự JSON nhưng có cấu trúc phức tạp hơn. Dù JSON phổ biến hiện nay, XML vẫn được ứng dụng rộng rãi trong các hệ thống tài chính, công cụ quản trị mạng và định nghĩa cấu hình máy ảo. Nhiều nền tảng ảo hóa như KVM sử dụng XML làm định dạng cấu hình chính nhờ tính mở rộng và khả năng biểu diễn cấu trúc dữ liệu phân cấp.

Dưới đây là ví dụ minh họa cấu trúc file cấu hình máy ảo KVM, thể hiện cách XML tổ chức dữ liệu qua các thẻ lồng nhau:

<mayAo type="kvm">
  <ten>Ubuntu22-Server</ten>
  <maDinhDanh>8a3b1c9d-5e7f-4a2b-8c6d-1e0f9a8b7c6d</maDinhDanh>
  <boNho donVi="KiB">2097152</boNho>
  <cpuSoLuong>2</cpuSoLuong>
  <thietBi>
    <oDia loai="file">
      <duongDan>/var/lib/vm/ubuntu22.qcow2</duongDan>
      <busKetNoi>virtio</busKetNoi>
    </oDia>
    <manHinh loai="spice">
      <cong>5900</cong>
    </manHinh>
  </thietBi>
</mayAo>

Khác với HTML tập trung vào hiển thị, XML chú trọng mô tả cấu trúc và nội dung dữ liệu. Trong Python, thư viện xml.etree.ElementTree cung cấp công cụ xử lý XML hiệu quả qua các thành phần chính:

1. Xây dựng tài liệu XML

Sử dụng Element để tạo nút gốc và SubElement cho các nút con. Thuộc tính được định nghĩa qua từ điển, nội dung văn bản gán trực tiếp cho thuộc tính text:

import xml.etree.ElementTree as ET

def tao_sitemap():
    root = ET.Element("sitemap", xmlns="http://www.sitemaps.org/schemas/sitemap/0.9")
    entry = ET.SubElement(root, "url")
    
    ET.SubElement(entry, "loc").text = "https://example.com"
    ET.SubElement(entry, "lastmod").text = "2023-10-15"
    ET.SubElement(entry, "changefreq").text = "weekly"
    
    ET.ElementTree(root).write("sitemap.xml", 
                             encoding="utf-8", 
                             xml_declaration=True)

if __name__ == "__main__":
    tao_sitemap()

2. Duyệt và truy vấn

Phương thức iter() cho phép duyệt đệ quy các nút, trong khi find() tìm kiếm nút đơn lẻ theo đường dẫn:

tree = ET.parse("mayAo.xml")
goc = tree.getroot()

# Duyệt tất cả nút 'ten'
for ten in goc.iter("ten"):
    print(f"Tên máy: {ten.text}")

# Cập nhật thông số bộ nhớ
for boNho in goc.findall(".//boNho"):
    giaTri = int(boNho.text) * 2
    boNho.text = str(giaTri)
    boNho.set("capNhat", "true")

tree.write("mayAo_moi.xml")

3. Sửa đổi và xóa phần tử

Thao tác trực tiếp trên đối tượng Element thông qua các phương thức set(), remove():

def tang_cpu(file):
    doc = ET.parse(file)
    root = doc.getroot()
    
    # Tăng số lượng CPU
    cpu = root.find(".//cpuSoLuong")
    if cpu is not None:
        cpu.text = str(int(cpu.text) + 1)
    
    # Xóa thiết bị không cần thiết
    for thietBi in root.findall(".//thietBi/oDia[@loai='cdrom']"):
        root.find(".//thietBi").remove(thietBi)
    
    doc.write("cauHinh_moi.xml")

Ví dụ xử lý file cấu hình mẫu:

<heThong>
  <server ten="db-server">
    <cpu>4</cpu>
    <ram>8192</ram>
  </server>
  <server ten="web-server">
    <cpu>2</cpu>
    <ram>4096</ram>
  </server>
</heThong>
tree = ET.parse("heThong.xml")
root = tree.getroot()

# Xóa server có RAM dưới 5000
for server in root.findall("server"):
    if int(server.find("ram").text) < 5000:
        root.remove(server)

tree.write("heThong_tinhGon.xml")

Thẻ: XML ElementTree python parsing Configuration

Đăng vào ngày 23 tháng 6 lúc 08:18