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

Parsing XML ด้วย SAX APIs ใน Python

SAX (Simple API for XML) เป็นอินเทอร์เฟซมาตรฐานสำหรับการแยกวิเคราะห์ XML แบบ event-driven การ parse XML ด้วย SAX ต้องสร้าง ContentHandler ของตัวเองโดยการสืบทอดจาก xml.sax.ContentHandler

ContentHandler จัดการกับแท็กและแอตทริบิวต์เฉพาะของ XML รูปแบบของคุณ อ็อบเจ็กต์ ContentHandler มีเมธอดสำหรับจัดการเหตุการณ์การ parse ต่างๆ Parser จะเรียกเมธอด ContentHandler ขณะที่กำลัง parse ไฟล์ XML

เมธอดสำคัญ

  • startDocument และ endDocument - เรียกที่เริ่มต้นและสิ้นสุดของไฟล์ XML
  • characters(text) - ส่งข้อมูลตัวอักษรของ XML ผ่านพารามิเตอร์ text
  • startElement(tag, attributes) และ endElement(tag) - เรียกที่เริ่มต้นและสิ้นสุดของแต่ละ element

The make_parser Method

xml.sax.make_parser([parser_list])

สร้าง parser object ใหม่และคืนค่ากลับ parser_list เป็นรายการ parser ที่จะใช้ (optional)

The parse Method

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

สร้าง SAX parser และใช้ parse เอกสาร xmlfile: ชื่อไฟล์ XML, contenthandler: ContentHandler object, errorhandler: SAX ErrorHandler object (optional)

The parseString Method

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

สร้าง SAX parser และ parse XML string ที่ระบุ

ตัวอย่างโค้ด

#!/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 = ""

    def startElement(self, tag, attributes):
        self.CurrentData = tag
        if tag == "movie":
            print "*****Movie*****"
            title = attributes["title"]
            print "Title:", title

    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 = ""

    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__"):
    parser = xml.sax.make_parser()
    parser.setFeature(xml.sax.handler.feature_namespaces, 0)
    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 APIs มาตรฐาน