Cộng đồng chia sẻ tri thức Lib24.vn

Python - Xử lý XML

Gửi bởi: Phạm Thọ Thái Dương 20 tháng 2 2020 lúc 11:01:29


Mục lục
* * * * *

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.

  1. 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ớ.
  2. 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ố -

  1. 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ố -

  1. xmlfile - Đây là tên của tệp XML cần đọc từ đó.
  2. contenthandler - Đây phải là một đối tượng ContentHandler.
  3. 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ố -

  1. xmlopes - Đây là tên của chuỗi XML để đọc từ.
  2. contenthandler - Đây phải là một đối tượng ContentHandler.
  3. 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