Python 3 - Pemrosesan XML
XML adalah bahasa sumber terbuka portabel yang memungkinkan pemrogram mengembangkan aplikasi yang dapat dibaca oleh aplikasi lain, apa pun sistem operasi dan / atau bahasa pengembangannya.
Apa itu XML?
Extensible Markup Language (XML) adalah bahasa markup seperti HTML atau SGML. Ini direkomendasikan oleh World Wide Web Consortium dan tersedia sebagai standar terbuka.
XML sangat berguna untuk melacak data dalam jumlah kecil hingga sedang tanpa memerlukan backbone berbasis SQL.
Arsitektur dan API Parser XML
Pustaka standar Python menyediakan sekumpulan antarmuka minimal tapi berguna untuk bekerja dengan XML.
Dua API yang paling dasar dan banyak digunakan untuk data XML adalah antarmuka SAX dan DOM.
Simple API for XML (SAX)- Di sini, Anda mendaftarkan panggilan balik untuk acara yang menarik dan kemudian membiarkan pengurai melanjutkan melalui dokumen. Ini berguna ketika dokumen Anda besar atau Anda memiliki keterbatasan memori, ini mengurai file saat membacanya dari disk dan seluruh file tidak pernah disimpan di memori.
Document Object Model (DOM) API - Ini adalah rekomendasi Konsorsium World Wide Web di mana seluruh file dibaca ke dalam memori dan disimpan dalam bentuk hierarki (berbasis pohon) untuk mewakili semua fitur dokumen XML.
SAX jelas tidak dapat memproses informasi secepat DOM, saat bekerja dengan file besar. Di sisi lain, menggunakan DOM secara eksklusif dapat benar-benar mematikan sumber daya Anda, terutama jika digunakan pada banyak file kecil.
SAX bersifat read-only, sedangkan DOM memungkinkan perubahan pada file XML. Karena kedua API yang berbeda ini benar-benar saling melengkapi, tidak ada alasan mengapa Anda tidak dapat menggunakan keduanya untuk proyek besar.
Untuk semua contoh kode XML kita, mari kita gunakan file XML sederhana movies.xml sebagai input -
<collection shelf = "New Arrivals">
<movie title = "Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title = "Transformers">
<type>Anime, Science Fiction</type>
<format>DVD</format>
<year>1989</year>
<rating>R</rating>
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
<movie title = "Trigun">
<type>Anime, Action</type>
<format>DVD</format>
<episodes>4</episodes>
<rating>PG</rating>
<stars>10</stars>
<description>Vash the Stampede!</description>
</movie>
<movie title = "Ishtar">
<type>Comedy</type>
<format>VHS</format>
<rating>PG</rating>
<stars>2</stars>
<description>Viewable boredom</description>
</movie>
</collection>
Mengurai XML dengan SAX API
SAX adalah antarmuka standar untuk penguraian XML berbasis peristiwa. Mengurai XML dengan SAX biasanya mengharuskan Anda membuat ContentHandler Anda sendiri dengan membuat subclass xml.sax.ContentHandler.
ContentHandler Anda menangani tag dan atribut tertentu dari ragam XML Anda. Objek ContentHandler menyediakan metode untuk menangani berbagai peristiwa penguraian. Parser pemiliknya memanggil metode ContentHandler saat mengurai file XML.
Metode startDocument dan endDocument dipanggil di awal dan di akhir file XML. Karakter metode (teks) melewati data karakter file XML melalui teks parameter.
ContentHandler dipanggil di awal dan akhir setiap elemen. Jika parser tidak dalam mode namespace, metode startElement (tag, atribut) dan endElement (tag) dipanggil; jika tidak, metode yang sesuai startElementNS dan endElementNS akan dipanggil. Di sini, tag adalah tag elemen, dan atribut adalah objek Attributes.
Berikut adalah metode penting lainnya untuk dipahami sebelum melanjutkan -
Metode make_parser
Metode berikut membuat objek parser baru dan mengembalikannya. Objek parser yang dibuat akan menjadi jenis parser pertama, yang ditemukan sistem.
xml.sax.make_parser( [parser_list] )
Berikut detail parameternya -
parser_list - Argumen opsional yang terdiri dari daftar parser yang akan digunakan yang semuanya harus mengimplementasikan metode make_parser.
Metode Parse
Metode berikut membuat parser SAX dan menggunakannya untuk mengurai dokumen.
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
Berikut detail parameternya -
xmlfile - Ini adalah nama file XML yang akan dibaca.
contenthandler - Ini harus berupa objek ContentHandler.
errorhandler - Jika ditentukan, errorhandler harus berupa objek SAX ErrorHandler.
Metode parseString
Ada satu metode lagi untuk membuat parser SAX dan mengurai yang ditentukan XML string.
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
Berikut detail parameternya -
xmlstring - Ini adalah nama string XML yang akan dibaca.
contenthandler - Ini harus berupa objek ContentHandler.
errorhandler - Jika ditentukan, errorhandler harus berupa objek SAX ErrorHandler.
Contoh
#!/usr/bin/python3
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentData = ""
self.type = ""
self.format = ""
self.year = ""
self.rating = ""
self.stars = ""
self.description = ""
# Call when an element starts
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "movie":
print ("*****Movie*****")
title = attributes["title"]
print ("Title:", title)
# Call when an elements ends
def endElement(self, tag):
if self.CurrentData == "type":
print ("Type:", self.type)
elif self.CurrentData == "format":
print ("Format:", self.format)
elif self.CurrentData == "year":
print ("Year:", self.year)
elif self.CurrentData == "rating":
print ("Rating:", self.rating)
elif self.CurrentData == "stars":
print ("Stars:", self.stars)
elif self.CurrentData == "description":
print ("Description:", self.description)
self.CurrentData = ""
# Call when a character is read
def characters(self, content):
if self.CurrentData == "type":
self.type = content
elif self.CurrentData == "format":
self.format = content
elif self.CurrentData == "year":
self.year = content
elif self.CurrentData == "rating":
self.rating = content
elif self.CurrentData == "stars":
self.stars = content
elif self.CurrentData == "description":
self.description = content
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("movies.xml")
Keluaran
Ini akan menghasilkan hasil sebagai berikut -
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A scientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom
Untuk detail lengkap tentang dokumentasi SAX API, silakan merujuk ke Python SAX API standar .
Mengurai XML dengan DOM API
Model Objek Dokumen ("DOM") adalah API lintas bahasa dari World Wide Web Consortium (W3C) untuk mengakses dan memodifikasi dokumen XML.
DOM sangat berguna untuk aplikasi akses acak. SAX hanya memungkinkan Anda melihat satu bit dokumen dalam satu waktu. Jika Anda melihat satu elemen SAX, Anda tidak memiliki akses ke yang lain.
Berikut adalah cara termudah untuk memuat dokumen XML dengan cepat dan membuat objek minidom menggunakan modul xml.dom. Objek minidom menyediakan metode parser sederhana yang dengan cepat membuat pohon DOM dari file XML.
Contoh frase memanggil fungsi parse (file [, parser]) dari objek minidom untuk mengurai file XML, yang ditunjuk oleh file ke dalam objek pohon DOM.
Contoh
#!/usr/bin/python3
from xml.dom.minidom import parse
import xml.dom.minidom
# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print ("Root element : %s" % collection.getAttribute("shelf"))
# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")
# Print detail of each movie.
for movie in movies:
print ("*****Movie*****")
if movie.hasAttribute("title"):
print ("Title: %s" % movie.getAttribute("title"))
type = movie.getElementsByTagName('type')[0]
print ("Type: %s" % type.childNodes[0].data)
format = movie.getElementsByTagName('format')[0]
print ("Format: %s" % format.childNodes[0].data)
rating = movie.getElementsByTagName('rating')[0]
print ("Rating: %s" % rating.childNodes[0].data)
description = movie.getElementsByTagName('description')[0]
print ("Description: %s" % description.childNodes[0].data)
Keluaran
Ini akan menghasilkan hasil sebagai berikut -
Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A scientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom
Untuk detail lengkap tentang dokumentasi API DOM, lihat API DOM Python standar .