try to use dom and sax api (python)

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

Upload: aey-unthika

Post on 13-Apr-2017

114 views

Category:

Education


6 download

TRANSCRIPT

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)