XML Parser Menggunakan Library Python XML.SAX

Subscribe Dengan Account Google Untuk Membaca Artikel Tanpa Iklan
XML Parser Menggunakan Library Python XML.SAX

Python merupakan salah satu bahasa yang ramah pada data dengan format XML, python menyediakan banyak library yang bisa anda gunakan untuk mengolah data dalam format XML.

Salah satu library bawaan dari python yaitu XML.SAX, library ini merupakan library default dari python 3.0, Untuk bisa menggunakan library ini pastikan di environment Anda library ini sudah terinstal.

Bagi Anda yang belum tau apa itu python environment dan bagaimana cara konfigurasi python environment Anda bisa membacanya pada tutorial berikut:


Apa Itu XML.SAX ?


Tidak seperti DOM , tidak ada spesifikasi formal untuk SAXSAX memproses dokumen secara mandiri, berbeda dengan DOM yang digunakan untuk pemrosesan dokumen XML yang bergantung pada state.

SAX adalah interface standar untuk event-driven XML parser. Parsing XML dengan SAX umumnya mengharuskan Anda untuk membuat ContentHandler Anda sendiri dengan mensubklasifikasikan xml.sax.ContentHandler.

ContentHandler dapat menangani tag dan atribut tertentu pada tagXML. Objek ContentHandler menyediakan metode untuk menangani berbagai event parser. Parser akan memanggil metode ContentHandler saat mem-parsing file XML.

Metode startDocument dan endDocument dipanggil di awal dan akhir file XML. Karakter metode (teks) dilewatkan oleh karakter dari file XML melalui teks parameter.

Membuat Interface XML Parser


Sebelum lanjut pada studi kasus, buat terlebih dahulu file dengan nama sample.xml, perhatikan kode dibawah ini

<?xml version="1.0"?>
<catalog xmlns="http://www.w3.org/2000/xmlns"
viewBox="-105 -100 210 270" width="210" height="270">
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
</catalog>

Pada dasarnya library dibuat untuk mempermudah developer, hal ini karena developer hanya tinggal menggunakan fungsi-fungsi yang ada pada library tersebut. Oleh karena di butuhkan interface untuk menghubungkan parser dengan library fungsi yang sudah tersedia.

Pada kode berikut kita akan membuat sebuah interface dengan nama BookHanlder(), interface BookHandler digunakan untuk memanggil fungsi parser pada library XML.SAX.

Buat sebuah file dengan nama sax_xml_handler.py, perhatikan kode berikut:

from xml.sax.handler import ContentHandler

class BookHandler(ContentHandler):
def startPrefixMapping(self, prefix, uri):
print(f"startPrefixMapping: {prefix=}, {uri=}")

def endPrefixMapping(self, prefix):
print(f"endPrefixMapping: {prefix=}")

def startElementNS(self, name, qname, attrs):
print(f"startElementNS: {name=}")

def endElementNS(self, name, qname):
print(f"endElementNS: {name=}")

 

Dari kode diatas dapat dipahami bahwa kita akan memparser tag-tag xml, dengan cara mengambil name uri dan name tag.

Pada Class BookHandler() terdapat fungsi untuk memparser tag xml dengan mengambil name tag awal dan akhir.

Selanjutnya panggil interface BookHandler(), perhatikan kode berikut:

from xml.sax import make_parser
from xml.sax.handler import feature_namespaces
from sax_xml_handler import BookHandler

parser = make_parser()
parser.setFeature(feature_namespaces, True)
parser.setContentHandler(BookHandler())

parser.parse("sample.xml")

 

Result:

startPrefixMapping: prefix=None, uri='http://www.w3.org/2000/xmlns'
startElementNS: name=('http://www.w3.org/2000/xmlns', 'catalog')
startElementNS: name=('http://www.w3.org/2000/xmlns', 'book')
startElementNS: name=('http://www.w3.org/2000/xmlns', 'author')
endElementNS: name=('http://www.w3.org/2000/xmlns', 'author')
startElementNS: name=('http://www.w3.org/2000/xmlns', 'title')
endElementNS: name=('http://www.w3.org/2000/xmlns', 'title')
startElementNS: name=('http://www.w3.org/2000/xmlns', 'genre')
endElementNS: name=('http://www.w3.org/2000/xmlns', 'genre')
startElementNS: name=('http://www.w3.org/2000/xmlns', 'price')
endElementNS: name=('http://www.w3.org/2000/xmlns', 'price')
startElementNS: name=('http://www.w3.org/2000/xmlns', 'publish_date')
endElementNS: name=('http://www.w3.org/2000/xmlns', 'publish_date')
startElementNS: name=('http://www.w3.org/2000/xmlns', 'description')
endElementNS: name=('http://www.w3.org/2000/xmlns', 'description')
endElementNS: name=('http://www.w3.org/2000/xmlns', 'book')
endElementNS: name=('http://www.w3.org/2000/xmlns', 'catalog')
endPrefixMapping: prefix=None

Membuat Parser XML To Json


Seperti halnya pada interface BookHandler() diatas, buat file dengan nama sax_xml_to_json.py, perhatikan kode berikut:

from xml.sax.handler import ContentHandler

class BookHandler(ContentHandler):

def __init__(self):
super().__init__()
self.element_stack = []

@property
def current_element(self):
return self.element_stack[-1]

def startElement(self, name, attrs):
self.element_stack.append({
"name": name,
"attributes": dict(attrs),
"children": [],
"value": ""
})

def endElement(self, name):
clean(self.current_element)
if len(self.element_stack) > 1:
child = self.element_stack.pop()
self.current_element["children"].append(child)

def characters(self, content):
self.current_element["value"] += content

def clean(element):
element["value"] = element["value"].strip()
for key in ("attributes", "children", "value"):
if not element[key]:
del element[key]


 

Pada interface BookHandler() terdapat atribut @propertyProperti merupakan jenis atribut khusus yang akan di ekseskusi ketika diakses. Properti sebenarnya adalah metode yang ditandai dengan dekorator @property.

Selanjutnya panggil interface BookHandler() dan perhatikan kode program berikut :

from xml.sax import parse
import json
from sax_xml_to_json import BookHandler

handler = BookHandler()
parse("sample.xml", handler)
root = handler.current_element
print(json.dumps(root, indent=4))

 

Result:

{
"name": "catalog",
"attributes": {
"xmlns": "http://www.w3.org/2000/xmlns",
"viewBox": "-105 -100 210 270",
"width": "210",
"height": "270"
},
"children": [
{
"name": "book",
"attributes": {
"id": "bk101"
},
"children": [
{
"name": "author",
"value": "Gambardella, Matthew"
},
{
"name": "title",
"value": "XML Developer's Guide"
},
{
"name": "genre",
"value": "Computer"
},
{
"name": "price",
"value": "44.95"
},
{
"name": "publish_date",
"value": "2000-10-01"
},
{
"name": "description",
"value": "An in-depth look at creating applications \n with XML."
}
]
}
]
}

 

Selesai sudah bahasan kita tentang library XML.SAX, jika Anda ingin mengeksplore lebih jauh tentang library ini Anda bisa mengunjungi situs berukut: https://docs.python.org/3/library/xml.sax.html

Demo:

Baca artikel lainya:


*** artikel ini dirangkum oleh penulis dari berbagai sumber, sebagai pengingat pada bahasa python

sumber referensi : realpython, python docs