XML là một ngôn ngữ mã nguồn mở, di động cho phép các lập trình viên phát triển các ứng dụng có thể được đọc bởi các ứng dụng khác, bất kể hệ điều hành và / hoặc ngôn ngữ phát triển.
XML là gì?
Ngôn ngữ đánh dấu mở rộng (XML) là ngôn ngữ đánh dấu giống như HTML hoặc SGML. Điều này được World Wide Web Consortium khuyến nghị và có sẵn như là một tiêu chuẩn mở.
XML cực kỳ hữu ích để theo dõi lượng dữ liệu từ nhỏ đến trung bình mà không yêu cầu xương sống dựa trên SQL.
Kiến trúc và API XML Parser
Thư viện chuẩn Python cung cấp một bộ giao diện tối thiểu nhưng hữu ích để làm việc với XML.
Hai API cơ bản và được sử dụng rộng rãi nhất cho dữ liệu XML là các giao diện SAX và DOM.
- API đơn giản cho XML (SAX) - Tại đây, bạn đăng ký các cuộc gọi lại cho các sự kiện quan tâm và sau đó để trình phân tích cú pháp tiến hành thông qua tài liệu. Điều này hữu ích khi tài liệu của bạn lớn hoặc bạn có giới hạn bộ nhớ, nó phân tích tệp khi nó đọc từ đĩa và toàn bộ tệp không bao giờ được lưu trong bộ nhớ.
- API mô hình đối tượng tài liệu (DOM) - Đây là khuyến nghị của World Wide Web Consortium trong đó toàn bộ tệp được đọc vào bộ nhớ và được lưu trữ ở dạng phân cấp (dựa trên cây) để thể hiện tất cả các tính năng của tài liệu XML.
SAX rõ ràng không thể xử lý thông tin nhanh như DOM khi làm việc với các tệp lớn. Mặt khác, sử dụng DOM độc quyền thực sự có thể giết chết tài nguyên của bạn, đặc biệt nếu được sử dụng trên nhiều tệp nhỏ.
SAX ở chế độ chỉ đọc, trong khi DOM cho phép thay đổi tệp XML. Vì hai API khác nhau này thực sự bổ sung cho nhau, không có lý do gì bạn không thể sử dụng cả hai cho các dự án lớn.
Đối với tất cả các ví dụ mã XML của chúng tôi, hãy sử dụng một tập tin XML đơn giản movies.xml như một đầu vào -
<collection shelf="New Arrivals">
<movie title="Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
<type>Anime, Science Fiction</type>
<format>DVD</format>
<year>1989</year>
<rating>R</rating>
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
<movie title="Trigun">
<type>Anime, Action</type>
<format>DVD</format>
<episodes>4</episodes>
<rating>PG</rating>
<stars>10</stars>
<description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
<type>Comedy</type>
<format>VHS</format>
<rating>PG</rating>
<stars>2</stars>
<description>Viewable boredom</description>
</movie>
</collection>
Phân tích cú pháp XML bằng API SAX
SAX là một giao diện chuẩn để phân tích cú pháp XML theo sự kiện. Phân tích cú pháp XML bằng SAX thường yêu cầu bạn tạo ContentHandler của riêng mình bằng cách phân lớp xml.sax.ContentHandler.
ContentHandler của bạn xử lý các thẻ và thuộc tính cụ thể của (các) hương vị XML của bạn. Một đối tượng ContentHandler cung cấp các phương thức để xử lý các sự kiện phân tích cú pháp khác nhau. Trình phân tích cú pháp sở hữu của nó gọi các phương thức ContentHandler vì nó phân tích tệp XML.
Các phương thức startDocument và endDocument được gọi ở đầu và cuối tệp XML. Các ký tự phương thức (văn bản) được truyền dữ liệu ký tự của tệp XML thông qua văn bản tham số.
ContentHandler được gọi ở đầu và cuối của mỗi phần tử. Nếu trình phân tích cú pháp không ở chế độ không gian tên, các phương thức startEuity (thẻ, thuộc tính) và endEuity (tag) được gọi; mặt khác, các phương thức tương ứng startEuityNS và endEuityNS được gọi. Ở đây, thẻ là thẻ phần tử và các thuộc tính là một đối tượng Thuộc tính.
Dưới đây là các phương pháp quan trọng khác để hiểu trước khi tiếp tục -
Các make_parser Phương pháp
Phương thức sau đây tạo một đối tượng trình phân tích cú pháp mới và trả về nó. Đối tượng trình phân tích cú pháp được tạo sẽ thuộc loại trình phân tích cú pháp đầu tiên mà hệ thống tìm thấy.
xml.sax.make_parser( [parser_list] )
Dưới đây là chi tiết của các tham số -
- Parser_list - Đối số tùy chọn bao gồm danh sách các trình phân tích cú pháp sẽ sử dụng, tất cả phải thực hiện phương thức make_parser.
Các phân tích Phương pháp
Phương thức sau đây tạo một trình phân tích cú pháp SAX và sử dụng nó để phân tích tài liệu.
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
Dưới đây là chi tiết của các tham số -
- xmlfile - Đây là tên của tệp XML cần đọc từ đó.
- contenthandler - Đây phải là một đối tượng ContentHandler.
- errorhandler - Nếu được chỉ định, errorhandler phải là đối tượng SAX ErrorHandler.
Các parseString Phương pháp
Có thêm một phương pháp để tạo trình phân tích cú pháp SAX và phân tích chuỗi XML đã chỉ định .
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
Dưới đây là chi tiết của các tham số -
- xmlopes - Đây là tên của chuỗi XML để đọc từ.
- contenthandler - Đây phải là một đối tượng ContentHandler.
- errorhandler - Nếu được chỉ định, errorhandler phải là đối tượng SAX ErrorHandler.
Thí dụ
#!/usr/bin/python
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentData = ""
self.type = ""
self.format = ""
self.year = ""
self.rating = ""
self.stars = ""
self.description = ""
# Call when an element starts
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "movie":
print "*****Movie*****"
title = attributes["title"]
print "Title:", title
# Call when an elements ends
def endElement(self, tag):
if self.CurrentData == "type":
print "Type:", self.type
elif self.CurrentData == "format":
print "Format:", self.format
elif self.CurrentData == "year":
print "Year:", self.year
elif self.CurrentData == "rating":
print "Rating:", self.rating
elif self.CurrentData == "stars":
print "Stars:", self.stars
elif self.CurrentData == "description":
print "Description:", self.description
self.CurrentData = ""
# Call when a character is read
def characters(self, content):
if self.CurrentData == "type":
self.type = content
elif self.CurrentData == "format":
self.format = content
elif self.CurrentData == "year":
self.year = content
elif self.CurrentData == "rating":
self.rating = content
elif self.CurrentData == "stars":
self.stars = content
elif self.CurrentData == "description":
self.description = content
if ( __name__ == "__main__"):
# create an XMLReader
parser = xml.sax.make_parser()
# turn off namepsaces
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# override the default ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )
parser.parse("movies.xml")
Điều này sẽ tạo ra kết quả sau -
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom
Để biết chi tiết đầy đủ về tài liệu API SAX, vui lòng tham khảo API SAX tiêu chuẩn của Python .
Phân tích cú pháp XML bằng API DOM
Mô hình đối tượng tài liệu ("DOM") là API ngôn ngữ chéo từ World Wide Web Consortium (W3C) để truy cập và sửa đổi các tài liệu XML.
DOM cực kỳ hữu ích cho các ứng dụng truy cập ngẫu nhiên. SAX chỉ cho phép bạn xem một bit của tài liệu tại một thời điểm. Nếu bạn đang xem xét một yếu tố SAX, bạn không có quyền truy cập vào yếu tố khác.
Đây là cách dễ nhất để tải nhanh một tài liệu XML và tạo một đối tượng tối thiểu bằng cách sử dụng mô đun xml.dom. Đối tượng minidom cung cấp một phương thức trình phân tích cú pháp đơn giản, nhanh chóng tạo một cây DOM từ tệp XML.
Cụm từ mẫu gọi hàm parse (tệp [, trình phân tích cú pháp]) của đối tượng minidom để phân tích tệp XML được chỉ định bởi tệp thành đối tượng cây DOM.
#!/usr/bin/python
from xml.dom.minidom import parse
import xml.dom.minidom
# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print "Root element : %s" % collection.getAttribute("shelf")
# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")
# Print detail of each movie.
for movie in movies:
print "*****Movie*****"
if movie.hasAttribute("title"):
print "Title: %s" % movie.getAttribute("title")
type = movie.getElementsByTagName('type')[0]
print "Type: %s" % type.childNodes[0].data
format = movie.getElementsByTagName('format')[0]
print "Format: %s" % format.childNodes[0].data
rating = movie.getElementsByTagName('rating')[0]
print "Rating: %s" % rating.childNodes[0].data
description = movie.getElementsByTagName('description')[0]
print "Description: %s" % description.childNodes[0].data
Điều này sẽ tạo ra kết quả sau -
Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom
Được cập nhật: 2 giờ trước (13:11:44) | Lượt xem: 622