SlideShare a Scribd company logo
“หนึ่งหน่วยกลุ่ม” (Group 1)
Selected Topics in Computer Engineering II
XMLparser
Python
หนึ่งหน่วยกลุ่ม
กลุ่มที่ทำงำนในเป้ ำหมำยเดียวกัน ทำงำนเป็ นหน่วย
เดียวกันอย่ำงมีระบบระเบียบ และไม่มีหัวหน้ำในกลุ่ม
จึงเรียกว่ำหนึ่งหน่วยกลุ่ม
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.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("==============================")
Try to use
DOM API
• Result
Try to use
DOM API
• Try to use DOM Create Element
import xml.dom.minidom
import 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
• Result
test_create_xml.xml
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')
Try to use
DOM API
• Result
test_create_xml.xml
ผลลัพธ์การใช้ dom จะเพิ่มจะลบจะใช้โนด
สามารถ เรียก element ได้ด้วย getElementsByTagName
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 = ""
# 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 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()
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-
นางสาว อัญธิกา หนองบัว รหัสนักศึกษา 56-010126-
นาย ธีรวัฒน์ ผ่องสกุล รหัสนักศึกษา 56-010126-3015-
นาย ธนดล เตชะวัชรีกุล รหัสนักศึกษา 56-010126-
นาย ภูมมิฑล ไชยเชิดเกียรติ รหัสนักศึกษา 56-010116-
Try to Use DOM and SAX API (python)

More Related Content

PPTX
To try use XSL for display group XML file movies
PDF
Xml parser week2
PDF
Introduction to XML.
PPTX
To try and create DTD and XML Schema
PDF
Assignmet1 selectedtopic Topic in Computer Engineer
PPTX
Assignmet1:Start by finding web services using SOAP and WSDL on the Internet/...
PDF
บทที่ 2 พื้นฐานภาษาจาวา
PPTX
ระบบ UNIX
To try use XSL for display group XML file movies
Xml parser week2
Introduction to XML.
To try and create DTD and XML Schema
Assignmet1 selectedtopic Topic in Computer Engineer
Assignmet1:Start by finding web services using SOAP and WSDL on the Internet/...
บทที่ 2 พื้นฐานภาษาจาวา
ระบบ UNIX

Viewers also liked (10)

PDF
Reliable Python REST API (by Volodymyr Hotsyk) - Web Back-End Tech Hangout - ...
PPTX
Python programming advance lab api npr 2
PDF
Rest api with Python
PDF
Python RESTful webservices with Python: Flask and Django solutions
PPT
Learn REST API with Python
PDF
The Cars In Fast And Furious 7
PDF
Developing RESTful Web APIs with Python, Flask and MongoDB
PDF
25 Cars Worth Waiting For 2016–2019
PDF
Most Reliable Cars
PDF
CSS Grid Layout for Topconf, Linz
Reliable Python REST API (by Volodymyr Hotsyk) - Web Back-End Tech Hangout - ...
Python programming advance lab api npr 2
Rest api with Python
Python RESTful webservices with Python: Flask and Django solutions
Learn REST API with Python
The Cars In Fast And Furious 7
Developing RESTful Web APIs with Python, Flask and MongoDB
25 Cars Worth Waiting For 2016–2019
Most Reliable Cars
CSS Grid Layout for Topconf, Linz
Ad

Try to Use DOM and SAX API (python)

  • 1. “หนึ่งหน่วยกลุ่ม” (Group 1) Selected Topics in Computer Engineering II XMLparser Python
  • 2. หนึ่งหน่วยกลุ่ม กลุ่มที่ทำงำนในเป้ ำหมำยเดียวกัน ทำงำนเป็ นหน่วย เดียวกันอย่ำงมีระบบระเบียบ และไม่มีหัวหน้ำในกลุ่ม จึงเรียกว่ำหนึ่งหน่วยกลุ่ม
  • 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("==============================")
  • 9. Try to use DOM API • Result
  • 10. Try to use DOM API • Try to use DOM Create Element import xml.dom.minidom import 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()
  • 11. Try to use DOM API • Result test_create_xml.xml
  • 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")
  • 18. Try to use SAX API • Result
  • 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()
  • 21. DOM & Database • Result หลังเพิ่มข้อมูล ปรากฏข้อมูลชื่อหนัง หลัง run python file
  • 22. Reference • DOM, SAX API http://ajbee.me/2015/09/23/web-data-part-1-xml/
  • 23. Members Group1 นาย อภิวัฒธ์วงศ์โท๊ะ รหัสนักศึกษา 52-1116-530-2 นางสาว พัลลภา เขมรังสฤษฏ์รหัสนักศึกษา 56- นางสาว อัญธิกา หนองบัว รหัสนักศึกษา 56-010126- นาย ธีรวัฒน์ ผ่องสกุล รหัสนักศึกษา 56-010126-3015- นาย ธนดล เตชะวัชรีกุล รหัสนักศึกษา 56-010126- นาย ภูมมิฑล ไชยเชิดเกียรติ รหัสนักศึกษา 56-010116-