XML là ngôn ngữ 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 có thể mở rộng [XML] là một ngôn ngữ đánh dấu giống như HTML hoặc SGML. Điều này được đề xuất bởi World Wide Web Consortium và có sẵn như một tiêu chuẩn mở.
XML cực kỳ hữu ích để theo dõi lượng dữ liệu 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 phân tích cú pháp XML và API
Thư viện tiêu chuẩn Python cung cấp một bộ giao diện tối thiểu nhưng hữu ích để hoạt động với XML.
Hai API cơ bản và được sử dụng rộng 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 rất 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 vì nó đọc nó từ đĩa và toàn bộ tệp không bao giờ được lưu trữ trong bộ nhớ. − Here, you register callbacks for events of interest and then let the parser proceed through the document. This is useful when your documents are large or you have memory limitations, it parses the file as it reads it from disk and the entire file is never stored in memory.
API mô hình đối tượng tài liệu [DOM]-Đây là khuyến nghị của tập đoàn web trên toàn thế giới trong đó toàn bộ tệp được đọc vào bộ nhớ và được lưu trữ trong một hình thức 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. − This is a World Wide Web Consortium recommendation wherein the entire file is read into memory and stored in a hierarchical [tree-based] form to represent all the features of an XML document.
Sax rõ ràng không thể xử lý thông tin nhanh như DOM có thể khi làm việc với các tệp lớn. Mặt khác, sử dụng DOM độc quyền có thể thực sự tiêu diệt tài nguyên của bạn, đặc biệt là nếu được sử dụng trên rất nhiều tệp nhỏ.
SAX chỉ đọc, trong khi DOM cho phép các thay đổi đối với tệp XML. Vì hai API khác nhau này bổ sung cho nhau theo nghĩa đen, 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ụ về mã XML của chúng tôi, hãy sử dụng một bộ phim XML đơn giản.xml làm đầu vào -
War, Thriller DVD 2003 PG 10 Talk about a US-Japan war Anime, Science Fiction DVD 1989 R 8 A schientific fiction Anime, Action DVD 4 PG 10 Vash the Stampede! Comedy VHS PG 2 Viewable boredom
Phân tích cú pháp XML với API Sax
SAX là một giao diện tiêu chuẩn cho phân tích cú pháp XML theo hướng sự kiện. Phân tích XML với 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ị của bạn của XML. Một đối tượng ContentHandler cung cấp các phương pháp để 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 khi nó phân tích tệp XML.
Các phương thức StartDocument và EndDocument được gọi là bắt đầu và kết thúc của 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 vào đầu và kết thúc của mỗi yếu 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 bắt đầu [thẻ, thuộc tính] và endelement [TAG] được gọi; Mặt khác, các phương thức tương ứng bắt đầu và endelementns đượ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à những phương pháp quan trọng khác để hiểu trước khi tiến hành -
Phương pháp make_parser
Phương thức sau tạo một đối tượng phân tích cú pháp mới và trả về nó. Đối tượng 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 một danh sách các trình phân tích cú pháp để sử dụng, tất cả phải thực hiện phương thức Make_parser. − The optional argument consisting of a list of parsers to use which must all implement the make_parser method.
Phương pháp phân tích cú pháp
Phương thức sau 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ố -
Parser_list - Đối số tùy chọn bao gồm một danh sách các trình phân tích cú pháp để sử dụng, tất cả phải thực hiện phương thức Make_parser. − This is the name of the XML file to read from.
Phương pháp phân tích cú pháp − This must be a ContentHandler object.
Phương thức sau 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. − If specified, errorhandler must be a SAX ErrorHandler object.
xml.sax.parse[ xmlfile, contenthandler[, errorhandler]]
XMLFILE - Đây là tên của tệp XML để đọc từ.XML string.
xml.sax.parseString[xmlstring, contenthandler[, errorhandler]]
Dưới đây là chi tiết của các tham số -
Parser_list - Đối số tùy chọn bao gồm một danh sách các trình phân tích cú pháp để sử dụng, tất cả phải thực hiện phương thức Make_parser. − This is the name of the XML string to read from.
Phương pháp phân tích cú pháp − This must be a ContentHandler object.
Phương thức sau 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. − If specified, errorhandler must be a SAX ErrorHandler object.
xml.sax.parse[ xmlfile, contenthandler[, errorhandler]]
#!/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"]
XMLFILE - Đây là tên của tệp XML để đọc từ.
*****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
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.
Phương pháp Parsestring
Có thêm một phương thức để tạo trình phân tích cú pháp sax và phân tích chuỗi XML được chỉ định.
XMLString - Đây là tên của chuỗi XML để đọc từ.
Thí dụ
#!/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
Để biết chi tiết đầy đủ trên tài liệu API DOM, vui lòng tham khảo API Python DOM tiêu chuẩn.