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 name và price. 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.