3. DOM & SAX
API
How to choose
- แอบพลิเคชันบำงตัวไม่ต้องกำรฟังค์ชั่นที่ DOM จัดให้ เพรำะเช่นนั้น DOM จึงกิน
หน่วยควำมจำมำกในกำรใช้งำน และมันจะลดประสิทธิภำพในกำรทำงำนของแอบพลิเคชัน
เมื่อเจอกับเอกสำรที่มีขนำดใหญ่ หน่วยควำมจำที่แผนผังรูปต้นไม้ของDOM ใช้สำมำรถมี
ขนำดใหญ่มำกกว่ำขนำดของไฟล์ 10 เท่ำ
- เพื่อควำมเร็วและไม่ต้องควำมละเอียดถี่ถ้วนในกำร parse กำรประมวลผล และไม่ต้องกำร
ควบคุมแผนผังรูปต้นไม้ SAX คือทำงเลือกที่เหมำะสม
- DOM ใช้งำนง่ำยกว่ำ SAX และมีอินเตอร ์เฟสที่ดูสะอำดตำมกกว่ำ โดยแสดงผลตำมรูปแบบที่
เรำต้องกำร
4. DOM & SAX
API
Choose SAX
- เลือกใช้ SAX เมื่อต้องทำงำนกับเอกสำรใหญ่ ที่มีโค้ดเยอะ คุณสมบัติของ SAX คือสำมำรถ
scan และ parse เอกสำรของ XML ขนำดใหญ่ได้โดยไม่ถึงขีดจำกัดของ resource เพรำะ
มันจะไม่พยำยำมสร้ำง DOM representation ในหน่วยควำมจำ ถ้ำคุณมีขีดจำกัดของ
resources บน server คุณควรจะใช้ SAX อย่ำงยิ่ง
- เมื่อต้องกำรดึงข้อมูลบ้ำงตัวที่มำจำกเอกสำร เรำสำมำรถยกเลิกกำรประมวลผลของ SAX ได้
ทุกเมื่อ ฉะนั้นเมื่อเรำมีสิ่งที่เรำต้องกำรจำกเอกสำร เรำสำมำรถยกเลิกกำรประมวลผลนั้นๆ
- สร้ำงเอกสำรย่อย เมื่อต้องทำงำนกับเอกสำรใหญ่ๆ ตัว SAX สำมำรถใช้สร้ำงเอกสำรย่อยเพื่อ
เก็บข้อมูลที่ต้องกำรได้ และ DOM ก็สำมำรถ ใช้เอกสำรย่อย ในกำรประมวลผลข้อมูล
5. DOM & SAX
API
• Choose DOM
• - เลือกใช้ DOM เพื่อต้องกำรแก้ไขเอกสำร ซึ่ง SAX ไม่สำมำรถแก้ไขเอกสำรที่เป็ น XML
ได้ นอกจำกอ่ำนเท่ำนั้น แน่นอนว่ำ SAX สำมำรถสร้ำงเอกสำร XML ใหม่พร้อมสิทธิ์ในกำร
แก้ไขเอกสำรได้ แต่ DOM จะเอื้ออำนวยวิธีที่ทำงำนกับเอกสำรที่ง่ำยกว่ำ โดยอนุญำตให้มี
กำรแก้ไขเอกสำรโดยตรง ฉะนั้น DOM จึงเป็ นวิธีกำรที่ทำงำนได้ดีในกำรแก้ไขเอกสำรและ
เปลี่ยนแปลงโครงสร้ำง
•
- กำรหำข้อมูลแบบสุ่มเลือกก็เป็ นจุดเด่นอีกอย่ำงหนึ่งของ DOM เพรำะมันจะเก็บข้อมูลของ
แผนผังรูปต้นไม้ทั้งอันไว้ในหน่วยควำมจำ
6. DOM & SAX
API
• ตัวอย่ำงกำรตีควำมข้อมูลแบบ DOM และ SAX
• โดยปกติเว็บบรำวเซอร ์จะทำกำรอ่ำนเอกสำร HTML หรือ XML แล้วสร้ำงเป็ น Tree ของ
เอกสำร (ผังรูปต้นไม้ : DOM Tree) แต่ในกำรทำงำนเรำสำมำรถใช้ได้ทั้ง DOM และ SAX
ซึ่งจะมีควำมแตกต่ำงกันนิดหน่อยดังนี้
• DOM อ่ำนข้อมูลแบบ Tree กำรเข้ำถึงข้อมูลสำมำรถเข้ำถึงจุดไหนเมื่อไหร่ก็ได้ เหมือน
แผ่นดิสก์สมำรถสร้ำง ลบ แก้ไข ข้อมูลในจุดต่ำงๆ ได้
• SAX อ่ำนข้อมูลแบบลำดับเหมือนกำรอ่ำนเทปมักใช้กับกำรอ่ำนอย่ำงเดียว
8. Try to use
DOM API
• กำรเรียกใช้งำน DOM ในกำรดึงข้อมูล
import xml.dom.minidom
dom = 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("tt"+type_.childNodes[0].data)
print ("tMain character:")
for name_actor in movie.getElementsByTagName("name_actor"):
print("tt"+name_actor.childNodes[0].data)
print ("tDirector:")
print
("tt"+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 ("tt"+day+"-"+month+"-"+year)
print("==============================")
12. Try to use
DOM API
• Try to use DOM Delete Element
import xml.dom.minidom
dom = 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')
13. Try to use
DOM API
• Result
test_create_xml.xml
ผลลัพธ์การใช้ dom จะเพิ่มจะลบจะใช้โนด
สามารถ เรียก element ได้ด้วย getElementsByTagName
14. Try to use
SAX API
การใช้ sax api ในภาษา python จาเป็นต้องเขียนคลาสขึ้นมาเพื่อรองรับข้อมูลในไฟล์ xml เนื่องจาก
การอ่านไฟล์ xml แบบ sax จะเป็นการอ่าน ไฟล์ทีละบรรทัดไม่เหมือน Dom ที่เก็บทั้งไฟล์เข้าไป
#!/usr/bin/python
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentData = ""
self.title = ""
self.type = ""
self.day = ""
self.month = ""
self.year = ""
self.stars = ""
self.director = ""
15. # 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
16. 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
17. 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")
19. DOM &
Database
• ลองทำกำร parser แบบ DOM โหลดข้อมูลมำเก็บไว้ใน Database
import xml.etree.ElementTree as ET
import mysql.connector
tree = 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()