Try to Use DOM and SAX API (python)

24
“หหหหหหหหหหหหหหห” (Group 1) Selected Topics in Computer Engineering II XMLparser Python

Transcript of Try to Use DOM and SAX API (python)

Page 1: Try to Use DOM and SAX API (python)

“หนึ่งหน่วยกลุ่ม ” (Group 1)Selected Topics in Computer Engineering II

XMLparserPython

Page 2: Try to Use DOM and SAX API (python)

หนึ่งหน่วยกลุ่ม

กลุ่มท่ีทำ�ง�นในเป้�หม�ยเดียวกัน ทำ�ง�นเป็นหน่วยเดียวกันอย�่งมรีะบบระเบยีบ และไมม่หัีวหน้�ในกลุ่ม จงึเรยีกว�่หนึ่งหน่วยกลุ่ม

Page 3: Try to Use DOM and SAX API (python)

DOM & SAX API

How to choose- แอบพลิเคชนับ�งตัวไมต้่องก�รฟงัค์ชัน่ท่ี DOM จัดให้ เพร�ะเชน่นัน้ DOM จึงกินหน่วยคว�มจำ�

ม�กในก�รใชง้�น และมนัจะลดประสทิธภิ�พในก�รทำ�ง�นของแอบพลิเคชนั เมื่อเจอกับเอกส�รท่ีมขีน�ดใหญ่ หน่วยคว�มจำ�ท่ีแผนผังรูปต้นไมข้องDOM ใชส้�ม�รถมขีน�ดใหญ่ม�กกว�่ขน�ดของไฟล์ 10 เท่�

- เพื่อคว�มเรว็และไมต้่องคว�มละเอียดถ่ีถ้วนในก�ร parse ก�รประมวลผล และไมต้่องก�รควบคมุแผนผังรูปต้นไม ้SAX คือท�งเลือกท่ีเหม�ะสม

- DOM ใชง้�นง่�ยกว�่ SAX และมอิีนเตอรเ์ฟสท่ีดสูะอ�ดต�มกกว�่ โดยแสดงผลต�มรูปแบบท่ีเร�ต้องก�ร

Page 4: Try to Use DOM and SAX API (python)

DOM & SAX API

Choose SAX- เลือกใช ้SAX เมื่อต้องทำ�ง�นกับเอกส�รใหญ่ ท่ีมโีค้ดเยอะ คณุสมบติัของ SAX คือส�ม�รถ

scan และ parse เอกส�รของ XML ขน�ดใหญ่ได้โดยไมถึ่งขดีจำ�กัดของ resource เพร�ะมนัจะไมพ่ย�ย�มสร�้ง DOM representation ในหน่วยคว�มจำ� ถ้�คณุมขีดีจำ�กัดของ resources บน server คณุควรจะใช ้SAX อย�่งยิง่

- เมื่อต้องก�รดึงขอ้มูลบ้�งตัวท่ีม�จ�กเอกส�ร เร�ส�ม�รถยกเลิกก�รประมวลผลของ SAX ได้ทกุเมื่อ ฉะนัน้เมื่อเร�มสีิง่ท่ีเร�ต้องก�รจ�กเอกส�ร เร�ส�ม�รถยกเลิกก�รประมวลผลนัน้ๆ

- สร�้งเอกส�รยอ่ย เมื่อต้องทำ�ง�นกับเอกส�รใหญ่ๆ ตัว SAX ส�ม�รถใชส้ร�้งเอกส�รยอ่ยเพื่อเก็บขอ้มูลท่ีต้องก�รได้ และ DOM ก็ส�ม�รถ ใชเ้อกส�รยอ่ย ในก�รประมวลผลขอ้มูล

Page 5: Try to Use DOM and SAX API (python)

DOM & SAX API

• Choose DOM• - เลือกใช ้DOM เพื่อต้องก�รแก้ไขเอกส�ร ซึง่ SAX ไมส่�ม�รถแก้ไขเอกส�รท่ีเป็น XML ได้

นอกจ�กอ่�นเท่�นัน้ แน่นอนว�่ SAX ส�ม�รถสร�้งเอกส�ร XML ใหมพ่รอ้มสทิธิใ์นก�รแก้ไขเอกส�รได้ แต่ DOM จะเอื้ออำ�นวยวธิท่ีีทำ�ง�นกับเอกส�รท่ีง่�ยกว�่ โดยอนุญ�ตให้มกี�รแก้ไขเอกส�รโดยตรง ฉะนัน้ DOM จงึเป็นวธิกี�รท่ีทำ�ง�นได้ดีในก�รแก้ไขเอกส�รและเปล่ียนแปลงโครงสร�้ง

•- ก�รห�ขอ้มูลแบบสุม่เลือกก็เป็นจุดเด่นอีกอย�่งหน่ึงของ DOM เพร�ะมนัจะเก็บขอ้มูลของแผนผังรูปต้นไมทั้้งอันไวใ้นหน่วยคว�มจำ�

Page 6: Try to Use DOM and SAX API (python)

DOM & SAX API

• ตัวอย�่งก�รตีคว�มขอ้มูลแบบ DOM และ SAX

• โดยปกติเวบ็บร�วเซอรจ์ะทำ�ก�รอ่�นเอกส�ร HTML หรอื XML แล้วสร�้งเป็น Tree ของเอกส�ร (ผังรูปต้นไม ้: DOM Tree) แต่ในก�รทำ�ง�นเร�ส�ม�รถใชไ้ด้ทั้ง DOM และ SAX ซึง่จะมคีว�มแตกต่�งกันนิดหน่อยดังนี้

• DOM อ่�นขอ้มูลแบบ Tree ก�รเข�้ถึงขอ้มูลส�ม�รถเข�้ถึงจุดไหนเมื่อไหรก็่ได้ เหมอืนแผ่นดิสก์ สม�รถสร�้ง ลบ แก้ไข ขอ้มูลในจุดต่�งๆ ได้

• SAX อ่�นขอ้มูลแบบลำ�ดับเหมอืนก�รอ่�นเทปมกัใชกั้บก�รอ่�นอย�่งเดียว

Page 7: Try to Use DOM and SAX API (python)

DOM & SAX API

Page 8: Try to Use DOM and SAX API (python)

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

Page 9: Try to Use DOM and SAX API (python)

Try to use DOM API

• Result

Page 10: Try to Use DOM and SAX API (python)

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()

Page 11: Try to Use DOM and SAX API (python)

Try to use DOM API

• Resulttest_create_xml.xml

Page 12: Try to Use DOM and SAX API (python)

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')

Page 13: Try to Use DOM and SAX API (python)

Try to use DOM API

• Resulttest_create_xml.xml

ผลลัพธก์�รใช้ dom จะเพิม่จะลบจะใชโ้นด ส�ม�รถ เรยีก element ได้ด้วย

getElementsByTagName

Page 14: Try to Use DOM and SAX API (python)

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

Page 15: Try to Use DOM and SAX API (python)

# 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

Page 16: Try to Use DOM and SAX API (python)

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

Page 17: Try to Use DOM and SAX API (python)

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

Page 18: Try to Use DOM and SAX API (python)

Try to use SAX API

• Result

Page 19: Try to Use DOM and SAX API (python)

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()

Page 20: Try to Use DOM and SAX API (python)

DOM & Database

• Result

ก่อนเพ่ิมขอ้มูล Database วา่ง

Page 21: Try to Use DOM and SAX API (python)

DOM & Database

• Result   หลังเพิม่ขอ้มูล ปรากฏขอ้มูลชื่อหนัง หลัง run python file

Page 22: Try to Use DOM and SAX API (python)

Reference• DOM, SAX API

http://ajbee.me/2015/09/23/web-data-part-1-xml/

Page 23: Try to Use DOM and SAX API (python)

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

Page 24: Try to Use DOM and SAX API (python)