author Ahmad Muhardian

Cara Parsing XML di Python dengan DOM API


Pemrograman Python

Python memungkinkan kita melakukan parsing (penguraian) dan manipulasi terhadap file XML dengan DOM API.

DOM (Document Object Model) adalah sebuah API yang menyediakan fungsi-fungsi untuk memanipulasi dokumen.

Salah satu modul DOM yang dapat kita gunakan untuk parsing XML adalah MiniDOM.

Pada kesempatan ini kita akan belajar cara parsing file XML dan HTML menggunakan MiniDom.

Apa saja yang akan kita pelajari?

  • Cara Parsing XML di Python
  • Cara Membuat Node/Elemen

Mari kita mulai…

Parsing XML di Python

Pertama, silahkan persiapkan sebuah file XML untuk di-parse.

Letakan filenya satu direktori dengan file program python-nya:

File XML dan Python

Isi File XML-nya seperti berikut:

<?xml version="1.0" encoding="UTF-8" ?>
<mahasiswa>
    <nama>Rena</nama>
    <alamat>Surabaya</alamat>
    <jurusan>Teknik Informatika</jurusan>

    <hobi name="Blogging"/>
    <hobi name="Membaca Buku"/>
    <hobi name="Nonton Anime"/>
</mahasiswa>

Pada file tersebut, terdapat node akar (root) yaitu <mahasiswa>, di dalamnya terdapat node lagi yang berisi data mahasiswa yang akan kita parse.

Selanjutnya silahkan kita buat program python-nya:

import xml.dom.minidom as minidom

def main():
    # gunakan fungsi parse() untuk me-load xml ke memori 
    # dan melakukan parsing
    doc = minidom.parse("mahasiswa.xml")

    # Cetak isi doc dan tag pertamanya
    print doc.nodeName
    print doc.firstChild.tagName


if __name__ == "__main__":
    main()

Sekarang coba jalankan dan perhatikan hasilnya:

Hasil eksekusi program Python XML

Penjelasannya:

Pertama kita membutuhkan modul atau library minidom, maka kita harus mengimpornya:

import xml.dom.minidom as minidom

Setelah itu, kita load file XML-nya ke memori dan langsung di-parse oleh fungsi parse() dari minidom.

doc = minidom.parse("mahasiswa.xml")

Selanjutnya, kita bisa lakukan manipulasi dengan variabel objek doc.

Sebagai contoh, kita mencetak nama node-nya dan tag pertama (root) yaitu <mahasiswa>.

print doc.nodeName
print doc.firstChild.tagName

Paham?

Sangat mudah bukan…

Baik, selanjutnya silahkan ubah dan lengkapi programmnya menjadi seperti ini:

import xml.dom.minidom as minidom

def main():
    # gunakan fungsi parse() untuk me-load xml ke memori 
    # dan melakukan parsing
    doc = minidom.parse("mahasiswa.xml")

    # Cetak isi doc dan tag pertamanya
    print doc.nodeName
    print doc.firstChild.tagName

    nama = doc.getElementsByTagName("nama")[0].firstChild.data
    alamat = doc.getElementsByTagName("alamat")[0].firstChild.data
    jurusan = doc.getElementsByTagName("jurusan")[0].firstChild.data
    list_hobi = doc.getElementsByTagName("hobi")

    print "Nama: {}\nAlamat: {}\nJurusan: {}\n".format(nama, alamat, jurusan)

    print "Memiliki {} hobi:".format(len(list_hobi))

    for hobi in list_hobi:
        print "-", hobi.getAttribute("name")


if __name__ == "__main__":
    main()

Sekarang coba eksekusi, maka hasil outputnya akan seperti ini:

#document
mahasiswa
Nama: Rena
Alamat: Surabaya
Jurusan: Teknik Informatika

Memiliki 3 hobi:
- Blogging
- Membaca Buku
- Nonton Anime

Penjelasan:

Nah untuk mengambil nilai dari node XML, kita dapat menggunakna fungsi getElementsByTagName().

Artinya kita memilih semua elemen dengan nama tag tertentu.

Fungsi tersebut akan menghasilkan list, bertasakan banyak elemen di dalam XML.

Misalkan untuk tag <nama>, akan menghasilkan:

[<DOM Element: nama at 0x7fe9280e2440>]

Sedangkan untuk tag <hobi>:

[
  <DOM Element: hobi at 0x7fe9280e27a0>, 
  <DOM Element: hobi at 0x7fe9280e2950>, 
  <DOM Element: hobi at 0x7fe9280e2b00>
]

List tersebut berisi objek DOM yang bisa kita ambil nilainya.

Misalkan kita ingin mengambil nilai nama:

nama = doc.getElementsByTagName("nama")[0].firstChild.data

Kita memilih objek DOM pada indeks ke-0, dan mengambil isinya.

Sedangkan untuk tag <hobi>, kita bisa menggunakan perulangan dan method getAttribute() untuk mengambil nilai dari atribut.

for hobi in list_hobi:
    print "-", hobi.getAttribute("name")

Menambahkan Node pada XML

Node atau elemen dapat kita tambahkan dengan beberapa metode.

Contoh:

# Membuat elemen XML baru <hobi>
hobi_baru = doc.createElement("hobi")
# Menambahkan atribut name pada <hobi> dengan nilai "programming"
hobi_baru.setAttribute("name", "Programming")
# Menambahkan elemen tersebut ke dalam <mahasiswa>
doc.firstChild.appendChild(hobi_baru)

Sekarang modifikasi kembali kode tadi menjadi seperti ini:

import xml.dom.minidom as minidom

def main():
    # gunakan fungsi parse() untuk me-load xml ke memori 
    # dan melakukan parsing
    doc = minidom.parse("mahasiswa.xml")

    # Cetak isi doc dan tag pertamanya
    print doc.nodeName
    print doc.firstChild.tagName

    nama = doc.getElementsByTagName("nama")[0].firstChild.data
    alamat = doc.getElementsByTagName("alamat")[0].firstChild.data
    jurusan = doc.getElementsByTagName("jurusan")[0].firstChild.data
    

    print "Nama: {}\nAlamat: {}\nJurusan: {}\n".format(nama, alamat, jurusan)

    # Mendambahkan Elemen
    hobi_baru = doc.createElement("hobi")
    hobi_baru.setAttribute("name", "Programming")
    doc.firstChild.appendChild(hobi_baru)

    # Ambil kembali daftar hobi
    list_hobi = doc.getElementsByTagName("hobi")

    print "Memiliki {} hobi:".format(len(list_hobi))

    for hobi in list_hobi:
        print "-", hobi.getAttribute("name")


if __name__ == "__main__":
    main()

Sekarang coba eksekusi dan perhatikanlah hasilnya:

#document
mahasiswa
Nama: Rena
Alamat: Surabaya
Jurusan: Teknik Informatika

Memiliki 4 hobi:
- Blogging
- Membaca Buku
- Nonton Anime
- Programming

Hobi sekarang ada 4…

Tunggu dulu, kok di file XML-nya tidak bertamabah?

Penambahan yang kita lakukan di atas bersifat temporer, artinya kalau programnya ditutup semua akan hilang.

Karena elemen tersebut hanya terseimpan dalam memori saja.

Bagaimana kalau kita igin menyimpannya ke dalam file XML?

Gampang.

Kita bisa gunakan teknik baca dan tulis file di Python.

Contoh:

# buka file XML dengan mode write (w)
file_xml = open("mahasiswa.xml","w")
# tulis XML yang ada di memori ke file XML
doc.writexml(file_xml)
# tutup file XML
file_xml.close()

Silahkan tambahakan kode tersebut pada program sebelumnya:

import xml.dom.minidom as minidom

def main():
    # gunakan fungsi parse() untuk me-load xml ke memori 
    # dan melakukan parsing
    doc = minidom.parse("mahasiswa.xml")

    # Cetak isi doc dan tag pertamanya
    print doc.nodeName
    print doc.firstChild.tagName

    nama = doc.getElementsByTagName("nama")[0].firstChild.data
    alamat = doc.getElementsByTagName("alamat")[0].firstChild.data
    jurusan = doc.getElementsByTagName("jurusan")[0].firstChild.data
    

    print "Nama: {}\nAlamat: {}\nJurusan: {}\n".format(nama, alamat, jurusan)

    hobi_baru = doc.createElement("hobi")
    hobi_baru.setAttribute("name", "Programming")
    doc.firstChild.appendChild(hobi_baru)

    list_hobi = doc.getElementsByTagName("hobi")

    print "Memiliki {} hobi:".format(len(list_hobi))

    for hobi in list_hobi:
        print "-", hobi.getAttribute("name")

    file_xml = open("mahasiswa.xml","w")
    doc.writexml(file_xml)
    file_xml.close()


if __name__ == "__main__":
    main()

Setelah itu, eksekusi dan coba buka file mahasiswa.xml.

Menulis File XML

Ajaib! 😄

Tag <hobi name="Programming"/> sudah ditambahkan.

Akhir Kata…

Itulah beberapa teknik memanipulasi, parsing, dan menulis file XML.

Selanjutnya mungkin kamu bisa membuat:

  • RSS Feed Reader yang membaca XML dari RSS Feed
  • Atau membuat sitemap.xml untuk website yang dibangun dengan Python

Kalau ada pertanyaan terkait dengan tutorial ini, silahkan samapaikan melalui komentar.

✍️ Catatan 22 Agustus 2017

Modul minidom tidak saya rekomendasikan, karena terdapat celah keamanan (vulnerabilities), tapi setidaknya kita bisa paham cara manipulasi file XML di Python dengan Modul ini.