CFSDN nhấn mạnh vào việc tạo ra giá trị thông qua mã nguồn mở. Chúng tôi cam kết xây dựng một nền tảng chia sẻ tài nguyên để mọi người làm CNTT có thể tìm thấy thế giới tuyệt vời của riêng mình tại đây.
Bài đăng trên blog CFSDN này Cách phân tích cú pháp XML bằng Python được tác giả thu thập và biên soạn. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.
XML là gì?
XML là viết tắt của eXtensible Markup Language, một tập hợp con của Standard Generalized Markup Language, là ngôn ngữ đánh dấu được sử dụng để đánh dấu các tài liệu điện tử nhằm tạo cấu trúc cho chúng. Bạn có thể tìm hiểu hướng dẫn về XML thông qua trang web này.
XML được thiết kế để truyền tải và lưu trữ dữ liệu.
XML là một tập hợp các quy tắc để xác định các thẻ ngữ nghĩa giúp chia tài liệu thành các phần và xác định các phần đó.
Nó cũng là một ngôn ngữ siêu đánh dấu, nghĩa là nó định nghĩa một ngôn ngữ cú pháp để định nghĩa các ngôn ngữ đánh dấu có cấu trúc, ngữ nghĩa và theo miền cụ thể khác.
Phân tích cú pháp XML bằng Python.
Các giao diện lập trình XML phổ biến bao gồm DOM và SAX. Hai giao diện này xử lý các tệp XML theo những cách khác nhau và có các tình huống sử dụng khác nhau.
Python có ba phương pháp để phân tích cú pháp XML: SAX, DOM và ElementTree
1.SAX (API đơn giản cho XML).
Thư viện chuẩn Python bao gồm trình phân tích cú pháp SAX. SAX sử dụng mô hình hướng sự kiện để xử lý các tệp XML bằng cách kích hoạt từng sự kiện một trong quá trình phân tích cú pháp XML và gọi các hàm gọi lại do người dùng xác định.
2.DOM (Mô hình đối tượng tài liệu).
Phân tích dữ liệu XML thành một cây trong bộ nhớ và thao tác XML bằng cách vận hành cây.
Nội dung của tệp ví dụ XML movies.xml được sử dụng trong chương này như sau:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
hai mươi mốt
hai mươi hai
hai mươi ba
hai mươi bốn
25
26
27
28
29
30
31
32
33
|
<
bộ sưu tập
cái kệ
=
"Hàng mới về"
>
<
bộ phim
tiêu đề
=
"Kẻ thù phía sau"
>
<
kiểu
>Chiến tranh, Kinh dị
kiểu
>
<
định dạng
>Đĩa DVD
định dạng
>
<
năm
>2003
năm
>
<
xếp hạng
>PG
xếp hạng
>
<
các ngôi sao
>10
các ngôi sao
>
<
Sự miêu tả
>Nói về chiến tranh Mỹ-Nhật
Sự miêu tả
>
bộ phim
>
<
bộ phim
tiêu đề
=
"Transformers"
>
<
kiểu
>Anime, Khoa học viễn tưởng
kiểu
>
<
định dạng
>Đĩa DVD
định dạng
>
<
năm
>1989
năm
>
<
xếp hạng
>R
xếp hạng
>
<
các ngôi sao
>8
các ngôi sao
>
<
Sự miêu tả
>Một hư cấu khoa học
Sự miêu tả
>
bộ phim
>
<
bộ phim
tiêu đề
=
"Trigun"
>
<
kiểu
>Anime, Hành động
kiểu
>
<
định dạng
>Đĩa DVD
định dạng
>
<
các tập phim
>4
các tập phim
>
<
xếp hạng
>PG
xếp hạng
>
<
các ngôi sao
>10
các ngôi sao
>
<
Sự miêu tả
>Vash the Stampede!
Sự miêu tả
>
bộ phim
>
<
bộ phim
tiêu đề
=
"Ishtar"
>
<
kiểu
>Hài kịch
kiểu
>
<
định dạng
>VHS
định dạng
>
<
xếp hạng
>PG
xếp hạng
>
<
các ngôi sao
>2
các ngôi sao
>
<
Sự miêu tả
>Sự nhàm chán có thể nhìn thấy
Sự miêu tả
>
bộ phim
>
bộ sưu tập
>
|
Python sử dụng SAX để phân tích cú pháp xml.
SAX là một API hướng sự kiện.
Việc phân tích cú pháp tài liệu XML bằng SAX bao gồm hai phần: trình phân tích cú pháp và trình xử lý sự kiện.
Bộ phân tích cú pháp có trách nhiệm đọc tài liệu XML và gửi các sự kiện như sự kiện bắt đầu và kết thúc phần tử đến trình xử lý sự kiện.
Trình xử lý sự kiện có trách nhiệm phản hồi sự kiện và xử lý dữ liệu XML được truyền vào.
- 1. Xử lý các tập tin lớn;
- 2. Chỉ cần một phần nội dung tệp hoặc chỉ cần thông tin cụ thể từ tệp.
- 3. Khi bạn muốn xây dựng mô hình đối tượng của riêng mình.
Để xử lý XML bằng SAX trong Python, trước tiên bạn phải nhập hàm phân tích cú pháp trong xml.sax và ContentHandler trong xml.sax.handler.
Giới thiệu phương thức lớp ContentHandler.
phương pháp ký tự (nội dung).
Thời gian gọi:
Từ đầu dòng, trước khi gặp thẻ, sẽ có các ký tự và giá trị của nội dung là các chuỗi này.
Từ thẻ này sang thẻ tiếp theo là các ký tự và giá trị của nội dung là các chuỗi này.
Trong một thẻ, trước khi gặp ký tự kết thúc dòng, sẽ có các ký tự và giá trị của nội dung là các chuỗi này.
Thẻ có thể là thẻ bắt đầu hoặc thẻ kết thúc.
Phương thức startDocument().
Được gọi khi tài liệu được bắt đầu.
Phương thức endDocument().
Được gọi khi trình phân tích cú pháp đến cuối tài liệu.
phương thức startElement(name, attrs).
Được gọi khi gặp thẻ bắt đầu XML, name là tên của thẻ và attrs là từ điển các giá trị thuộc tính cho thẻ.
phương thức endElement(name).
Được gọi khi gặp thẻ đóng XML.
phương thức make_parser.
Phương pháp sau đây tạo một đối tượng phân tích cú pháp mới và trả về nó.
?
1
|
xml.sax.make_parser( [danh sách phân tích cú pháp] )
|
Mô tả tham số
- parser_list - tham số tùy chọn, danh sách các trình phân tích cú pháp
phương pháp phân tích cú pháp.
Phương pháp sau đây tạo ra trình phân tích cú pháp SAX và phân tích cú pháp tài liệu XML:
?
1
|
xml.sax.parse(xmlfile, trình xử lý nội dung[, trình xử lý lỗi])
|
Mô tả tham số
- xmlfile - tên tệp xml
- contenthandler - phải là một đối tượng ContentHandler
- errorhandler - nếu được chỉ định, errorhandler phải là đối tượng SAX ErrorHandler
phương thức parseString.
Phương thức parseString tạo ra một trình phân tích cú pháp XML và phân tích một chuỗi XML:
?
1
|
xml.sax.parseString(xmlstring, trình xử lý nội dung[, trình xử lý lỗi])
|
Mô tả tham số
- xmlstring - chuỗi xml
- contenthandler - phải là một đối tượng ContentHandler
- errorhandler - nếu được chỉ định, errorhandler phải là đối tượng SAX ErrorHandler
Ví dụ phân tích cú pháp XML của Python.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
hai mươi mốt
hai mươi hai
hai mươi ba
hai mươi bốn
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
nhập khẩu
xml. sax
lớp học
Trình xử lý phim(xml.sax.ContentHandler):
định nghĩa
__khởi tạo__(
bản thân
):
bản thân
.Dữ liệu hiện tại
=
""
bản thân
.
kiểu
=
""
bản thân
.
định dạng
=
""
bản thân
.năm
=
""
bản thân
.đánh giá
=
""
bản thân
.sao
=
""
bản thân
.Sự miêu tả
=
""
định nghĩa
bắt đầuPhần tử(
bản thân
, thẻ, thuộc tính):
bản thân
.Dữ liệu hiện tại
=
nhãn
nếu như
nhãn
=
=
"bộ phim"
:
in
(
"********Bộ phim********"
)
tiêu đề
=
thuộc tính[
"tiêu đề"
]
in
(
"Tiêu đề:"
, tiêu đề)
định nghĩa
phần tử cuối(
bản thân
, nhãn):
nếu như
bản thân
.Dữ liệu hiện tại
=
=
"kiểu"
:
in
(
"Kiểu:"
,
bản thân
.
kiểu
)
nếu
bản thân
.Dữ liệu hiện tại
=
=
"định dạng"
:
in
(
"Định dạng:"
,
bản thân
.
định dạng
)
nếu
bản thân
.Dữ liệu hiện tại
=
=
"năm"
:
in
(
"Năm:"
,
bản thân
.năm)
nếu
bản thân
.Dữ liệu hiện tại
=
=
"xếp hạng"
:
in
(
"Xếp hạng:"
,
bản thân
.đánh giá)
nếu
bản thân
.Dữ liệu hiện tại
=
=
"sao"
:
in
(
"Các ngôi sao:"
,
bản thân
.sao)
nếu
bản thân
.Dữ liệu hiện tại
=
=
"Sự miêu tả"
:
in
(
"Sự miêu tả:"
,
bản thân
.Sự miêu tả)
bản thân
.Dữ liệu hiện tại
=
""
định nghĩa
nhân vật(
bản thân
, nội dung):
nếu như
bản thân
.Dữ liệu hiện tại
=
=
"kiểu"
:
bản thân
.
kiểu
=
nội dung
nếu
bản thân
.Dữ liệu hiện tại
=
=
"định dạng"
:
bản thân
.
định dạng
=
nội dung
nếu
bản thân
.Dữ liệu hiện tại
=
=
"năm"
:
bản thân
.năm
=
nội dung
nếu
bản thân
.Dữ liệu hiện tại
=
=
"xếp hạng"
:
bản thân
.đánh giá
=
nội dung
nếu
bản thân
.Dữ liệu hiện tại
=
=
"sao"
:
bản thân
.sao
=
nội dung
nếu
bản thân
.Dữ liệu hiện tại
=
=
"Sự miêu tả"
:
bản thân
.Sự miêu tả
=
nội dung
nếu như
( __tên__
=
=
"__chủ yếu__"
):
bộ phân tích cú pháp
=
xml.sax.make_parser()
bộ phân tích cú pháp.setFeature(xml.sax.handler.feature_namespaces,
0
)
Người xử lý
=
Trình xử lý phim()
parser.setContentHandler( Trình xử lý )
parser.parse(
"phim.xml"
)
|
Kết quả thực hiện của đoạn mã trên như sau:
*****Phim***** Tựa đề: Enemy Behind Thể loại: Chiến tranh, Phim kinh dị Định dạng: DVD Năm: 2003 Xếp hạng: PG Sao: 10 Mô tả: Nói về cuộc chiến tranh giữa Hoa Kỳ và Nhật Bản *****Phim***** Tựa đề: Transformers Thể loại: Anime, Khoa học viễn tưởng Định dạng: DVD Năm: 1989 Xếp hạng: R Sao: 8 Mô tả: Một tác phẩm khoa học viễn tưởng *****Phim***** Tựa đề: Trigun Thể loại: Anime, Phim hành động Định dạng: DVD Xếp hạng: PG Sao: 10 Mô tả: Vash the Stampede! *****Phim***** Tựa đề: Ishtar Thể loại: Hài Định dạng: VHS Xếp hạng: PG Sao: 2 Mô tả: Sự nhàm chán có thể xem được 。
Để biết tài liệu đầy đủ về API SAX, hãy xem API Python SAX.
Sử dụng xml.dom để phân tích cú pháp xml.
Mô hình đối tượng tài liệu (DOM) là giao diện lập trình chuẩn để xử lý ngôn ngữ đánh dấu mở rộng được tổ chức W3C đề xuất.
Khi trình phân tích cú pháp DOM phân tích cú pháp một tài liệu XML, nó sẽ đọc toàn bộ tài liệu cùng một lúc và lưu tất cả các phần tử trong tài liệu vào một cấu trúc cây trong bộ nhớ. Sau đó, bạn có thể sử dụng các hàm khác nhau do DOM cung cấp để đọc hoặc sửa đổi nội dung và cấu trúc của tài liệu hoặc ghi nội dung đã sửa đổi vào tệp XML.
Sử dụng xml.dom.minidom trong Python để phân tích cú pháp các tệp XML. Ví dụ như sau:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
hai mươi mốt
hai mươi hai
hai mươi ba
hai mươi bốn
25
26
27
28
|
từ
xml.dom.minidom
nhập khẩu
phân tích
nhập khẩu
xml.dom.minidom
DOMTree
=
xml.dom.minidom.parse(
"phim.xml"
)
bộ sưu tập
=
DOMTree.documentPhần tử
nếu như
bộ sưu tập.hasAttribute(
"cái kệ"
):
in
(
"Phần tử gốc: %s"
%
bộ sưu tập.getAttribute(
"cái kệ"
))
phim
=
bộ sưu tập.getElementsByTagName(
"bộ phim"
)
vì
bộ phim
TRONG
phim:
in
(
"********Bộ phim********"
)
nếu như
phim.hasAttribute(
"tiêu đề"
):
in
(
"Tiêu đề: %s"
%
phim.getAttribute(
"tiêu đề"
))
kiểu
=
phim.getElementsByTagName(
'kiểu'
)[
0
]
in
(
"Loại: %s"
%
kiểu
.childNodes[
0
].dữ liệu)
định dạng
=
phim.getElementsByTagName(
'định dạng'
)[
0
]
in
(
"Định dạng: %s"
%
định dạng
.childNodes[
0
].dữ liệu)
xếp hạng
=
phim.getElementsByTagName(
'xếp hạng'
)[
0
]
in
(
"Xếp hạng: %s"
%
đánh giá.childNodes[
0
].dữ liệu)
Sự miêu tả
=
phim.getElementsByTagName(
'Sự miêu tả'
)[
0
]
in
(
"Mô tả: %s"
%
mô tả.childNodes[
0
].dữ liệu)
|
Kết quả thực hiện của chương trình trên như sau:
Yếu tố gốc: Phim mới ra mắt *****Phim***** Tựa đề: Enemy Behind Thể loại: Chiến tranh, Phim kinh dị Định dạng: DVD Xếp hạng: PG Mô tả: Nói về chiến tranh Mỹ-Nhật *****Phim***** Tựa đề: Transformers Thể loại: Anime, Khoa học viễn tưởng Định dạng: DVD Xếp hạng: R Mô tả: Một tác phẩm khoa học viễn tưởng *****Phim***** Tựa đề: Trigun Thể loại: Anime, Hành động Định dạng: DVD Xếp hạng: PG Mô tả: Vash the Stampede! *****Phim***** Tựa đề: Ishtar Thể loại: Hài kịch Định dạng: VHS Xếp hạng: PG Mô tả: Sự nhàm chán có thể xem được 。
Để biết tài liệu đầy đủ về DOM API, hãy xem Python DOM API.
Trên đây là chi tiết về cách Python phân tích cú pháp XML. Để biết thêm thông tin về Python phân tích cú pháp XML, vui lòng chú ý đến các bài viết liên quan khác của tôi! .
Liên kết gốc: https://www.runoob.com/python3/python3-xml-processing.html.
Cuối cùng, bài viết này về cách Python phân tích cú pháp XML kết thúc tại đây. Nếu bạn muốn biết thêm về cách Python phân tích cú pháp XML, vui lòng tìm kiếm các bài viết trên CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!