Đọc (read) file XML với Python

Đây là bài 42/54 bài của series môn học Ngôn ngữ lập trình Python

1. XML (Extensible Markup Language) là gì?

XML (Extensible Markup Language) gọi là ngôn ngữ đánh dấu mở rộng. XML thường được sử dụng để tổ chức, lưu trữ, truyền gửi dữ liệu giữa các hệ thống khác nhau. XML được xây dựng dựa trên một tập hợp các quy tắt để mã hóa dữ liệu thành một document với định dạng cụ thể. Giả sử, chúng ta có 1 file items.xml có nội dung như bên dưới:

<data>
    <items>
        <item name="item1" price="5">book</item>
        <item name="item2" price="15">chair</item>
        <item name="item3" price="20">window</item>
    </items>
</data>

File items.xml đơn giản gồm các thẻ (tag) lồng nhau. Trong đó, mỗi thẻ item có thuộc tính nameprice. Chúng ta sẽ sử dụng file items.xml cho các ví dụ đọc file XML trong bài này.

Việc đọc và phân tích file XML thường được gọi là phân tích cú pháp (parsing). Trong Python, chúng ta có thể parsing file XML bằng cách thư viện:

    • BeautifulSoup
    • ElementTree
    • minidom

2. Đọc (read) file XML với BeautifulSoup

Thư viện BeautifulSoup hỗ trợ HTML parser (lxml) giúp đọc file xml. Để sử dụng lxml parser, chúng ta cần cài đặt thư viện này với câu lệnh sau:

# install beautifulsoup
pip install beautifulsoup4

#install lmxl parser
pip install lxml

Các bạn có thể đọc lại bài Cài đặt Python và môi trường lập trình với Visual Studio Code để biết cách cài đặt các thư viện Python trong Visual Studio Code.

Để đọc file xml với lxml, chúng ta thực hiện 2 bước: 1) Tìm các thẻ (tag) trong xml, 2) Rút trích dữ liệu từ các thẻ (tag).

from bs4 import BeautifulSoup
# reading data in items.xml
with open('items.xml', 'r') as f:
    data = f.read()
# passing data inside the beautifulsoup parser
bs_data = BeautifulSoup(data, "xml")
# finding all instances of tag item
bs_item = bs_data.find_all('item')
print(bs_item)

# using find() to get a tag with specified attribute
bs_name = bs_data.find('item', {'name':'item1'})
print(bs_name)

# extracting the text stored in a tag
text = bs_name.get_text()
print(text)

# extracting the data stored in a specific attribute of a tag
value = bs_name.get('price')
print(value)
Kết quả
[<item name="item1" price="5">book</item>, <item name="item2" price="15">chair</item>, <item name="item3" price="20">window</item>]
<item name="item1" price="5">book</item>
book
5

Các hàm của BeautifulSoup thường được sử dụng để đọc file XML như:

  • Hàm find_all() tìm tất cả các thẻ (tag) được chỉ định.
  • Hàm find() tìm một thẻ đầu tiên phù hợp với yêu cầu.
  • Hàm get_text() lấy ra text của thẻ.
  • Hàm get() lấy ra giá trị của thuộc tính của một thẻ.

Các bạn có thể tìm hiểu thêm cách sử dụng BeautifulSoup tại Beautiful Soup Documentation.

3. Đọc (read) file XML với ElementTree

Module ElementTree cung cấp rất nhiều công cụ để thao tác với file XML. Module ElementTree được xây dựng sẵn trong Python nên chúng ta không cần cài đặt bất kỳ thư viện nào thêm để sử dụng ElementTree.

Tổ chức lữu trữ dữ liệu của file XML là một định dạng dữ liệu phân cấp nên việc biểu diễn nó bằng cây sẽ dễ dàng hơn rất nhiều. Module ElementTree cung cấp các phương thức để biểu diễn toàn bộ tài liệu XML dưới dạng một cây duy nhất. Việc này rất phù hợp trong thao tác với file XML.

Module ElementTree cung cấp hàm ElementTree.parse() để bắt đầu phân tích cú pháp của file XML. Sau đó, hàm getroot() giúp lấy thẻ root trong file XML. Thẻ root sẽ có các thẻ con được đánh index bắt đầu từ 0. Các thẻ con sẽ có thuộc tính attrib để giúp truy xuất các thuộc tính của một thẻ.

# importing element tree
import xml.etree.ElementTree as ET

# Pass the path of the xml document
tree = ET.parse('items.xml')

# get the root tag
root = tree.getroot()

# print the root tag along with its memory location
print(root)

# print the text contained within first subtag of the 0th tag from the root
print(root[0][0].text)

# print the attributes of the first subtag of the 0th tag from the root
print(root[0][0].attrib)
Kết quả
<Element 'data' at 0x0000023CC11D8D60>
book
{'name': 'item1', 'price': '5'}

Các bạn có thể tìm hiểu thêm cách sử dụng ElementTree tại The ElementTree XML API.

4. Đọc (read) file XML với minidom

Module minidom được tích hợp sẵn trong Python. Chúng ta chỉ cần import xml.dom.minidom để sử dụng module minidom. Module này hỗ trợ hàm parse() để đọc file XML. Với minidom, mỗi thẻ (tag) sẽ được xem là một đối tượng (object). Chúng ta có thể truy cập các thuộc tính (attribute) và văn bản (text) của một thẻ bằng cách truy cập các thuộc tính của đối tượng.

from xml.dom import minidom

# parse file items.xml
file = minidom.parse('items.xml')

# use getElementsByTagName() to get tags
items = file.getElementsByTagName('item')

# one specific item attribute
print('Value of attribute name of item #2:')
print(items[1].attributes['name'].value)

# all attributes of item tags
print('\nAll values of attribute name:')
for elem in items:
  print(elem.attributes['name'].value)

# one specific item's data
print('\nData of item:')
print(items[1].firstChild.data)
print(items[1].childNodes[0].data)

# all items data
print('\nAll item data:')
for elem in items:
  print(elem.firstChild.data)
Kết quả
Value of attribute name of item #2:
item2

All values of attribute name:
item1
item2
item3

Data of item:
chair
chair

All item data:
book
chair
window

Các bạn có thể tìm hiểu thêm cách sử dụng minidom tại Minimal DOM implementation.

5/5 - (2 bình chọn)
Bài trước và bài sau trong môn học<< Các thao tác trên thư mục (directory) với PythonGhi (write) file XML với Python >>
Chia sẻ trên mạng xã hội:

Để lại một bình luận

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.