Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การแยกวิเคราะห์ XML ด้วย SAX APIs ใน Python


SAX เป็นอินเทอร์เฟซมาตรฐานสำหรับการแยกวิเคราะห์ XML ที่ขับเคลื่อนด้วยเหตุการณ์ โดยทั่วไปการแยกวิเคราะห์ XML ด้วย SAX คุณจะต้องสร้าง ContentHandler ของคุณเองโดยจัดคลาสย่อย xml.sax.ContentHandler

ContentHandler ของคุณจัดการแท็กและคุณลักษณะเฉพาะของรสชาติ XML ของคุณ ออบเจ็กต์ ContentHandler จัดเตรียมวิธีในการจัดการเหตุการณ์การแยกวิเคราะห์ต่างๆ parser ที่เป็นเจ้าของเรียกเมธอด ContentHandler ขณะที่แยกวิเคราะห์ไฟล์ XML

เมธอด startDocument และ endDocument ถูกเรียกที่จุดเริ่มต้นและจุดสิ้นสุดของไฟล์ XML อักขระวิธี (ข้อความ) ถูกส่งผ่านข้อมูลอักขระของไฟล์ XML ผ่านข้อความพารามิเตอร์

ContentHandler ถูกเรียกที่จุดเริ่มต้นและจุดสิ้นสุดของแต่ละองค์ประกอบ ถ้า parser ไม่ได้อยู่ในโหมดเนมสเปซ เมธอด startElement(tag, attributes) และ endElement(tag) จะถูกเรียก มิฉะนั้น จะเรียกเมธอดที่เกี่ยวข้อง startElementNS และ endElementNS ในที่นี้ tag คือแท็กองค์ประกอบ และแอตทริบิวต์เป็นออบเจ็กต์แอตทริบิวต์

ต่อไปนี้เป็นวิธีสำคัญอื่นๆ ที่ควรทำความเข้าใจก่อนดำเนินการ -

วิธี make_parser

เมธอดต่อไปนี้สร้างอ็อบเจ็กต์ parser ใหม่และส่งคืน ออบเจ็กต์ parser ที่สร้างขึ้นจะเป็นประเภท parser แรกที่ระบบพบ

xml.sax.make_parser( [parser_list] )

นี่คือรายละเอียดของพารามิเตอร์ -

  • parser_list − อาร์กิวเมนต์ที่เป็นทางเลือกที่ประกอบด้วยรายการของ parsers ที่จะใช้ ซึ่งทั้งหมดต้องใช้เมธอด make_parser

วิธีแยกวิเคราะห์

เมธอดต่อไปนี้จะสร้างตัวแยกวิเคราะห์ SAX และใช้เพื่อแยกวิเคราะห์เอกสาร

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

นี่คือรายละเอียดของพารามิเตอร์ -

  • xmlfile − นี่คือชื่อของไฟล์ XML ที่จะอ่านได้
  • ตัวจัดการเนื้อหา − นี่ต้องเป็นอ็อบเจ็กต์ ContentHandler
  • ตัวจัดการข้อผิดพลาด − หากระบุไว้ ตัวจัดการข้อผิดพลาดต้องเป็นอ็อบเจ็กต์ SAX ErrorHandler

วิธี parseString

มีอีกวิธีหนึ่งในการสร้างตัวแยกวิเคราะห์ SAX และแยกวิเคราะห์ สตริง XML . ที่ระบุ .

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

นี่คือรายละเอียดของพารามิเตอร์ -

  • xmlstring − นี่คือชื่อของสตริง XML ที่จะอ่าน
  • ตัวจัดการเนื้อหา − นี่ต้องเป็นอ็อบเจ็กต์ ContentHandler
  • ตัวจัดการข้อผิดพลาด − หากระบุไว้ ตัวจัดการข้อผิดพลาดต้องเป็นอ็อบเจ็กต์ SAX 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")

สิ่งนี้จะทำให้เกิดผลลัพธ์ดังต่อไปนี้ -

*****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

สำหรับรายละเอียดทั้งหมดเกี่ยวกับเอกสาร SAX API โปรดดูที่ Python SAX API มาตรฐาน