Lenovo LOQ Gaming 15IRX9 Intel Core i5Lenovo LOQ 15IRX9 83DV00A8ID - CI5-13450HX/12GB/512GB/RTX3050 6GB/15.6 FHD IPS/WIN11+OHS2021/LUNA GREY - FREE GIFT - MOUSE - BACKPACK - PERFORMANCE - Processor : Intel® Core™ i5-13450HX, 10C (6P + 4E) / 16T, P-core 2.4 / 4.6GHz, E-core 1.8 / 3.4GHz, 20MB Free Klik Disini ! |
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:
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.
<?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 ContentHandlerclass 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 BookHandlerparser = 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
from xml.sax.handler import ContentHandlerclass 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"] += contentdef 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 @property. Properti 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 BookHandlerhandler = 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:
sumber referensi : realpython, python docs