try to use dom and sax api (python)
TRANSCRIPT
“หนึ่งหน่วยกลุ่ม ” (Group 1)Selected Topics in Computer Engineering II
XMLparserPython
หนึ่งหน่วยกลุ่ม
กลุ่มท่ีทำ�ง�นในเป้�หม�ยเดียวกัน ทำ�ง�นเป็นหน่วยเดียวกันอย�่งมรีะบบระเบยีบ และไมม่หัีวหน้�ในกลุ่ม จงึเรยีกว�่หนึ่งหน่วยกลุ่ม
DOM & SAX API
How to choose- แอบพลิเคชนับ�งตัวไมต้่องก�รฟงัค์ชัน่ท่ี DOM จัดให้ เพร�ะเชน่นัน้ DOM จึงกินหน่วยคว�มจำ�
ม�กในก�รใชง้�น และมนัจะลดประสทิธภิ�พในก�รทำ�ง�นของแอบพลิเคชนั เมื่อเจอกับเอกส�รท่ีมขีน�ดใหญ่ หน่วยคว�มจำ�ท่ีแผนผังรูปต้นไมข้องDOM ใชส้�ม�รถมขีน�ดใหญ่ม�กกว�่ขน�ดของไฟล์ 10 เท่�
- เพื่อคว�มเรว็และไมต้่องคว�มละเอียดถ่ีถ้วนในก�ร parse ก�รประมวลผล และไมต้่องก�รควบคมุแผนผังรูปต้นไม ้SAX คือท�งเลือกท่ีเหม�ะสม
- DOM ใชง้�นง่�ยกว�่ SAX และมอิีนเตอรเ์ฟสท่ีดสูะอ�ดต�มกกว�่ โดยแสดงผลต�มรูปแบบท่ีเร�ต้องก�ร
DOM & SAX API
Choose SAX- เลือกใช ้SAX เมื่อต้องทำ�ง�นกับเอกส�รใหญ่ ท่ีมโีค้ดเยอะ คณุสมบติัของ SAX คือส�ม�รถ
scan และ parse เอกส�รของ XML ขน�ดใหญ่ได้โดยไมถึ่งขดีจำ�กัดของ resource เพร�ะมนัจะไมพ่ย�ย�มสร�้ง DOM representation ในหน่วยคว�มจำ� ถ้�คณุมขีดีจำ�กัดของ resources บน server คณุควรจะใช ้SAX อย�่งยิง่
- เมื่อต้องก�รดึงขอ้มูลบ้�งตัวท่ีม�จ�กเอกส�ร เร�ส�ม�รถยกเลิกก�รประมวลผลของ SAX ได้ทกุเมื่อ ฉะนัน้เมื่อเร�มสีิง่ท่ีเร�ต้องก�รจ�กเอกส�ร เร�ส�ม�รถยกเลิกก�รประมวลผลนัน้ๆ
- สร�้งเอกส�รยอ่ย เมื่อต้องทำ�ง�นกับเอกส�รใหญ่ๆ ตัว SAX ส�ม�รถใชส้ร�้งเอกส�รยอ่ยเพื่อเก็บขอ้มูลท่ีต้องก�รได้ และ DOM ก็ส�ม�รถ ใชเ้อกส�รยอ่ย ในก�รประมวลผลขอ้มูล
DOM & SAX API
• Choose DOM• - เลือกใช ้DOM เพื่อต้องก�รแก้ไขเอกส�ร ซึง่ SAX ไมส่�ม�รถแก้ไขเอกส�รท่ีเป็น XML ได้
นอกจ�กอ่�นเท่�นัน้ แน่นอนว�่ SAX ส�ม�รถสร�้งเอกส�ร XML ใหมพ่รอ้มสทิธิใ์นก�รแก้ไขเอกส�รได้ แต่ DOM จะเอื้ออำ�นวยวธิท่ีีทำ�ง�นกับเอกส�รท่ีง่�ยกว�่ โดยอนุญ�ตให้มกี�รแก้ไขเอกส�รโดยตรง ฉะนัน้ DOM จงึเป็นวธิกี�รท่ีทำ�ง�นได้ดีในก�รแก้ไขเอกส�รและเปล่ียนแปลงโครงสร�้ง
•- ก�รห�ขอ้มูลแบบสุม่เลือกก็เป็นจุดเด่นอีกอย�่งหน่ึงของ DOM เพร�ะมนัจะเก็บขอ้มูลของแผนผังรูปต้นไมทั้้งอันไวใ้นหน่วยคว�มจำ�
DOM & SAX API
• ตัวอย�่งก�รตีคว�มขอ้มูลแบบ DOM และ SAX
• โดยปกติเวบ็บร�วเซอรจ์ะทำ�ก�รอ่�นเอกส�ร HTML หรอื XML แล้วสร�้งเป็น Tree ของเอกส�ร (ผังรูปต้นไม ้: DOM Tree) แต่ในก�รทำ�ง�นเร�ส�ม�รถใชไ้ด้ทั้ง DOM และ SAX ซึง่จะมคีว�มแตกต่�งกันนิดหน่อยดังนี้
• DOM อ่�นขอ้มูลแบบ Tree ก�รเข�้ถึงขอ้มูลส�ม�รถเข�้ถึงจุดไหนเมื่อไหรก็่ได้ เหมอืนแผ่นดิสก์ สม�รถสร�้ง ลบ แก้ไข ขอ้มูลในจุดต่�งๆ ได้
• SAX อ่�นขอ้มูลแบบลำ�ดับเหมอืนก�รอ่�นเทปมกัใชกั้บก�รอ่�นอย�่งเดียว
DOM & SAX API
Try to use DOM API
• ก�รเรยีกใชง้�น DOM ในก�รดึงขอ้มูลimport xml.dom.minidomdom = xml.dom.minidom.parse('MovieAll_SPN.xml')for movie in dom.getElementsByTagName("movie"): print(movie.getElementsByTagName("name")[0].childNodes[0].data) print ("\tType:") for type_ in movie.getElementsByTagName("type"): print("\t\t"+type_.childNodes[0].data) print ("\tMain character:") for name_actor in movie.getElementsByTagName("name_actor"): print("\t\t"+name_actor.childNodes[0].data) print ("\tDirector:") print ("\t\t"+movie.getElementsByTagName("director")[0].childNodes[0].data) print ("\tDate:") day = movie.getElementsByTagName("day")[0].childNodes[0].data month = movie.getElementsByTagName("month")[0].childNodes[0].data year = movie.getElementsByTagName("year")[0].childNodes[0].data print ("\t\t"+day+"-"+month+"-"+year) print("==============================")
Try to use DOM API
• Result
Try to use DOM API
• Try to use DOM Create Elementimport xml.dom.minidomimport xml.dom#dom = xml.dom.minidom.parse('test_create_xml.xml')doc = xml.dom.minidom.Document()root = doc.createElement("movie")root.setAttribute( "name", 'abcd' )doc.appendChild(root) tempChild = doc.createElement("type")root.appendChild(tempChild)nodeText = doc.createTextNode("Action")tempChild.appendChild(nodeText)doc.writexml( open('test_create_xml.xml', 'w'), indent=" ", addindent=" ", newl='\n') doc.unlink()
Try to use DOM API
• Resulttest_create_xml.xml
Try to use DOM API
• Try to use DOM Delete Element
import xml.dom.minidomdom = xml.dom.minidom.parse('test_create_xml.xml')#movie = dom.getElementsByTagName("movie")[0]dom.removeChild(dom.childNodes[0])dom.writexml( open('test_create_xml.xml', 'w'), indent=" ", addindent=" ", newl='\n')
Try to use DOM API
• Resulttest_create_xml.xml
ผลลัพธก์�รใช้ dom จะเพิม่จะลบจะใชโ้นด ส�ม�รถ เรยีก element ได้ด้วย
getElementsByTagName
Try to use SAX API
การใช้ sax api ในภาษา python จำาเป็นต้องเขยีนคลาสขึ้นมาเพื่อรองรบัขอ้มูล ในไฟล์ xml เนื่องจากการอ่านไฟล์ xml แบบ sax จะเป็นการอ่าน ไฟล์ทีละ
บรรทัดไมเ่หมอืน Dom ท่ีเก็บทัง้ไฟล์เขา้ไป#!/usr/bin/pythonimport xml.saxclass MovieHandler( xml.sax.ContentHandler ): def __init__(self): self.CurrentData = "" self.title = "" self.type = "" self.day = "" self.month = "" self.year = "" self.stars = "" self.director = ""
# Call when an element starts def startElement(self, tag, attributes): self.CurrentData = tag if tag == "movie": print "*****Movie*****" elif tag == "types": print "Type:" elif tag == "stars": print "Stars:" elif tag == "director": print "Director:" elif tag == "name": print "Title:" elif tag == "date": print "Date:" def endElement(self, tag): if self.CurrentData == "name": print " ", self.title elif self.CurrentData == "type": print " ", self.type elif self.CurrentData == "date": print "Date:", self.date elif self.CurrentData == "name_actor": print " ", self.stars elif self.CurrentData == "director": print " ", self.director elif self.CurrentData == "day": print " ", self.day,self.month,self.year self.CurrentData = ""
Try to use SAX API
Try to use SAX API
# Call when a character is read def characters(self, content): if self.CurrentData == "type": self.type = content elif self.CurrentData == "day": self.day = content elif self.CurrentData == "month": self.month = content elif self.CurrentData == "year": self.year = content elif self.CurrentData == "name": self.title = content elif self.CurrentData == "name_actor": self.stars = content elif self.CurrentData == "director": self.director = content
Try to use SAX API
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("MovieAll_SPN.xml")
Try to use SAX API
• Result
DOM & Database
• ลองทำ�ก�ร parser แบบ DOM โหลดขอ้มูลม�เก็บไวใ้น Database
import xml.etree.ElementTree as ETimport mysql.connectortree = ET.parse('MovieAll_SPN.xml')root = tree.getroot()conn = mysql.connector.connect(host="localhost", user="root", passwd="1234", db="selecttopic") c = conn.cursor()for movie in root.findall('movie'): moviename = movie.find('name').text c.execute('insert into test values("'+moviename+'")') print (movie.find('name').text) conn.commit() conn.close()
DOM & Database
• Result
ก่อนเพ่ิมขอ้มูล Database วา่ง
DOM & Database
• Result หลังเพิม่ขอ้มูล ปรากฏขอ้มูลชื่อหนัง หลัง run python file
Reference• DOM, SAX API
http://ajbee.me/2015/09/23/web-data-part-1-xml/
Members
Group1นาย อภิวฒัธ ์วงศ์โท๊ะ รหสันักศึกษา 52-1116-530-2นางสาว พลัลภา เขมรงัสฤษฏ์ รหสันักศึกษา 56-010126-2008-1นางสาว อัญธกิา หนองบวั รหสันักศึกษา 56-010126-3028-1นาย ธรีวฒัน์ ผ่องสกลุ รหสันักศึกษา 56-010126-3015-9นาย ธนดล เตชะวชัรกีลุ รหสันักศึกษา 56-010126-3009-4นาย ภมูมฑิล ไชยเชดิเกียรติ รหสันักศึกษา 56-010116-2131-8