XML
eXtensible Markup Language (XML) merupakan bahasa yang digunakan untuk meningkatkan fungsionalitas web, dengan menyediakan pengidentifikasian informasi secara fleksibel dan dapat disadur (adaptable) dengan mudah.
HTML (HyperText Markup Language) merupakan bahasa yang dikenal untuk melakukan pengemasan dan penyajian informasi dalam web, seperti halnya yang kita pelajari dalam buku ini, bagaimana menghasilkan dokumen HTML secara dinamik dengan menggunakan PHP. Dalam HTML kita menggunakan tag-tag yang telah ditentukan, tag-tag yang merupakan bahasa markup, menandai dokumen memiliki elemen apa saja, kemudian bagaimana harus ditampilkan dalam browser web.
XML merupakan format penyimpanan data standar, mudah untuk melakukan saling tukar (pertukaran) data. Dokumen XML berisi suatu metadata, data yang memiliki penjelasan (informasi) tentang data itu sendiri. XML dapat disebut juga sebagai 'metalanguage' suatu bahasa yang digunakan untuk mendefinisikan bahasa yang lain.
Kata extensible menunjukkan suatu fasilitas yang memungkinkan kita untuk menambah atau mendefinisikan 'bahasa markup' sendiri, bukan seperti HTML yang hanya memiliki tag untuk mendefinisikan elemen dokumen, yang menunjukkan tanda bagaimana ditampilkan dalam browser web.
XML secara umum digunakan untuk mendefinisikan bagaimana informasi secara terstruktur disimpan. XML digunakan sebagai format untuk pertukaran data, memungkinkan data dari satu sistem dibaca oleh sistem lain. XML disimpan sebagai file teks (ASCII) biasa.
PHP sebagai bahasa scripting dapat digunakan untuk melakukan pemrosesan data dalam format XML. Pada bab ini dibahas bagaimana menggunakan PHP untuk melakukan pemrosesan data berasal dari dokumen XML kemudian ditampilkan dalam browser web.
Dokumen XML
Dokumen XML merupakan file teks (ASCII) biasa, di dalamnya berisi metadata, data yang memiliki informasi tentang data itu sendiri. Informasi tentang data dinyatakan dalam tag-tag, data untuk setiap informasi disimpan diantara tag-tag.
HTML memiliki tag-tag yang telah didefinisikan oleh W3C (konsonium standardisasi teknologi web, termasuk HTML), browser web dapat dengan mudah bagaimana menampilkan informasi dari dokumen HTML berdasarkan tag-tag yang ada di dalamnya. Isi dokumen XML juga memiliki tag-tag. Tag yang ada dalam dokumen XML dapat didefinisikan sendiri, artinya kita dapat membuat tag-tag sendiri untuk menggambarkan data yang ada dalam dokumen XML tersebut.
Beberapa standar XML telah berhasil didefinisikan dan berlaku secara internasional, contohnya adalah XML untuk berita, dikenal sebagai XMLnews. Selain itu ada juga standar XML yang digunakan untuk kebutuhan transaksi untuk e-commerce, standar XML ini hanya berlaku untuk komunitas e-commerce yang bersangkutan, tetapi secara prinsip sebenarnya sudah ada standar data dalam format XML yang harus diikuti oleh komunitas tersebut.
Sebenarnya masih banyak lagi standar data yang telah dibuat dengan menggunakan format XML. Dokumen atau data dalam XML dapat dikatakan sebagai suatu database tersendiri dengan format yang sangat general dan dapat dengan mudah disadur atau diambil untuk kebutuhan sistem informasi manajemen.
Tag-tag dalam XML memiliki aturan yang sama seperti halnya tag HTML, hanya saja nama tag dapat didefinisikan sendiri. Pembahasan bab XML dalam buku ini akan mencontohkan pada bagaimana membuat dokumen XML untuk katalog buku.
Katalogsuatu buku umumnya memiliki informasi:
- ISBN (no registrasi buku)
- Topik buku (klasifikasi berdasarkan topik)
- Judul buku
- Penulis
- Penerbit
- Tahun terbit
- Dan lain-lain
File daftar katalog buku, dengan informasi setiap data buku nomor buku sampai dengan informasi tahun terbit seperti di atas, adalah sebagai berikut, dapat dalam bentuk sebagai berikut:
ISBN : PW-001
Klasifikasi : Pemrograman Komputer
Judul : Dasar Pemrograman Web dengan HTML
Penulis : Betha Sidik dan Husni Pohan
Penerbit : CV Informatika
Tahun Terbit : 2001
ISBN : PW-002
Klasifikasi : Pemrograman Komputer
Judul : Pemrograman Web dengan PHP
Penulis : Betha Sidik
Penerbit : CV Informatika
Tahun : 2001
ISBN : PW-003
Klasifikasi : Database Komputer
Judul : MySQL
Penulis : Betha Sidik
Penerbit : CV Informatika
Tahun Terbit : 2003
Data katalog buku di atas jika ditampilkan dengan menggunakan HTML maka kita akan memiliki dua macam dokumen HTML, pertama adalah dokumen HTML yang digunakan untuk menampilkan katalog dengan informasi setiap buku dinyatakan dalam beberapa baris, dan yang kedua kita akan membuat tabel daftar katalog buku dengan menggunakan tag table HTML.
Berikut adalah contoh HTML untuk membuat dokumen HTML untuk membuat dokumen HTML seperti di atas:
HTML untuk model penyajian katalog yg contoh kesatu:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<html>
<head>
<title>Katalog Buku v l</title>
</head>
<body>
<h1>Daftar Katalog Buku</h1>
<hr>
<p>
ISBN: PW-001
<br>
Klasifikasi: Pemrograman Komputer
<br>
Judul: Dasar Pemrograman Web dengan HTML
<br>
Penulis : Betha Sidik dan Husni Pohan
<br>
Penerbit : CV Informatika
<br>
Tahun Terbit: 2001
</p>
<p>
ISBN: PW-002
<br>
Klasifikasi : Pemrograman Komputer
<br>
Judul : Pemrograman Web dengan PHP
<br>
Penulis : Betha Sidik
<br>
Penerbit : CV Informatika
<br>
Tahun Terbit : 2001
</p>
<p>
ISBN: PW-003
<br>
Judul : MySQL
<br>
Penulis : Betha Sidik
<br>
Penerbit : CV Informatika
<br>
Tahun Terbit : 2003
</p>
<hr>
</body>
</html>
HTML untuk menyajikan daftar katalog buku contoh kedua dengan menggunakan elemen table HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<html>
<head>
<title>Katalog Buku v 2</title>
</head>
<body>
<hl>Daftar Katalog Buku</hl>
<hr>
<table>
<tr>
<td>ISBN</td>
<td>Klasifikasi</td>
<td>Judul</td>
<td>Penulis</td>
<td>Penerbit</td>
<td>Tahun Terbit</td>
</tr>
<tr>
<td>PW-001</td>
<td>Pemrograman Komputer</td>
<td>Dasar Pemrograman Web dengan HTML</td>
<td>Betha Sidik dan Husni Pohan</td>
<td>CV Informatika</td>
<td>2001</td>
</tr>
<tr>
<td>PW-002</td>
<td>Pemrograman Komputer</td>
<td>Pemrograman Web dengan HTML</td>
<td>Betha Sidik</td>
<td>CV Informatika</td>
<td>2001</td>
</tr>
<tr>
<td>PW-003</td>
<td>Database Komputer</td>
<td>MySQL</td>
<td>Betha Sidik</td>
<td>CV Informatika</td>
<td>2003</td>
</tr>
</table>
</body>
</html>
Contoh dokumen HTML di atas, menunjukkan bagaimana kita dapat menyajikan daftar katalog buku dengan menggunakan tag-tag HTML, sehingga dapat ditampilkan dalam browser.
Contoh Dokumen XML
Berikut adalah dokumen XML sederhana untuk membuat daftar katalog buku (beri nama file XML yang dibuat dengan nama katalog_1.xml):
<?xml version="1.0" encoding="ISO-8859-1"?>
<katalog>
<buku>
<isbn>PW-001</isbn>
<klasifikasi>Pemrograman Komputer</klasifikasi>
<judul>Dasar Pemrogaman Web dengan HTML</judul>
<penulis>Betha Sidik dan Husni Pohan</penulis>
<penerbit>CV Informatika</penerbit>
<tahun>2001</tahun>
</buku>
<buku>
<isbn>PW-002</isbn>
<klasifikasi>Perograman Komputer</klasifikasi>
<judul>Pemrograman Web dengan PHP</judul>
<penulis>Betha Sidik</penulis>
<penerbit>CV Informatika</penerbit>
<tahun>2001</tahun>
</buku>
<buku>
<isbn>PW-003</isbn>
<klasifikasi>Database Komputer</klasifikasi>
<judul>MySQL</judul>
<penulis>Betha Sidik</penulis>
<penerbit>CV Informatika</penerbit>
<tahun>2003</tahun>
</buku>
</katalog>
Berdasarkan contoh dokumen XML daftar katalog buku di atas, kita dapat melihat bahwa tag-tag yang digunakan dalam file katalog_1.xml, murni bukanlah tag-tag HTML, tetapi merupakan tag-tag yang kita definisikan sendiri.
Tag diawali dengan nama tag, kemudian diakhiri dengan garis miring dan diikuti dengan nama tag. Nama tag selalu diapit dengan tanda kurung sudut lebih kecil (<) dan tanda kurung sudut lebih besar (>), menjadi <namatag> dan diakhiri dengan </namatag>. Tag selalu berpasangan.
Khusus untuk baris pertama, kita perlu menuliskannya, untuk mendeklarasikan XML, yang berisi versi XML dan pengkodean karakter yang digunakan dalam dokumen ini. Dalam kasus ini, dokumen XML yang didefinisikan sesuai dengan spesifikasi XML versi 1.0 dan pengkodean karakter yang digunakan adalah ISO-8859-1.
Pada contoh di atas, tag <katalog> adalah nama tag utama dalam dokumen XML yang menyatakan isi dari dokumen XML adalah data katalog, kemudian diikuti dengan tag-tag yang menyatakan informasi dari data buku, diawali dengan tag <buku>, yaitu no ISBN, klasifikasi buku, judul buku, penulis, penerbit, dan tahun diterbitkan. </buku> merupakan tag akhir tag <buku>, yang menunjukkan informasi dari setiap buku. </katalog>menunjukkan akhir dari data katalog.
Penulisan tag pembuka dan tag penutup harus ditulis dengan besar huruf yang sama, dengan huruf kecil semua, atau huruf besar semua, atau campuran. Secara prinsip harus sama cara penulisannya, karena 'case sensitive'.
Menampilkan Dokumen XML dalam Browser
Karena browser adalah aplikasi yang digunakan untuk menampilkan informasi dari dokumen HTML, maka setiap dokumen XML yang akan disajikan oleh browser harus terlebih dahulu diproses sehingga tag XML yang belum dikenal oleh browser dapat dimengerti oleh browser web, sehingga browser web dapat menampilkan isi dari dokumen XML tersebut atau dengan melakukan penterjemahan dari tag XML menjadi tag HTML dengan format yang didefinisikan oleh pemrogramannya.
PHP sering dikenal sebagai bahasa pemrograman yang mengimplementasi teknologi baru, termasuk XML sejak Desember 1998, pada PHP versi 3.06.
Penanganan dokumen XML oleh PHP dapat dilakukan dengan salah satu cara berikut:
- Secara manual dengan membuat aplikasi PHP sendiri.
- Dengan menggunakan fungsi expat atau SAX,
- DOM (Document Object Model), PHP class untuk XML,
- atau menggunakan objek Java.
Penanganan secara manual XML dengan membuat script PHP secara murni, akan tetapi kini, membuat fungsi PHP sendiri tidak perlu dilakukan, karena PHP telah menyediakan fungsi-fungsinya.
Setiap isi dokumen HTML yang akan ditampilkan dalam browser web akan diproses dengan menggunakan prosesor XML, yang sering disebut dengan parser XML.
Dua macam parser XML dasar:
- Parser berbasis pohon (tree based parser)
Parser ini akan mentransformasikan dokumen XML ke dalam struktur pohon. Parser jenis ini akan menganalisis seluruh dokumen, hasilnya akan dapat diakses oleh suatu librari API berupa struktur pohon, secara standar umum dikenal dengan Document Object Model (DOM).
- Parser berbasis event (event based parser)
Parser ini akan mentransformasikan dokumen XML menjadi serangkaian event. Jika ada suatu event terjadi maka event ini akan memanggil fungsi yang disediakan oleh developer untuk menanganinya.
Pada bab ini akan dibahas dua macam parser dasar, yang akan menterjemahkan dokumen XML menjadi dokumen HTML:
- Parser dengan menggunakan fungsi expat (SAX), tergolong parser berbasis event
- Parser dengan Menggunakan fungsi DOM, tergolong pada parser berbasis pohon.
Fungsi Expat (SAX) untuk XML
Fungsi expat digunakan untuk melakukan proses parsing dokumen XML. Fungsi ini diadopsi dari librari C untuk parser XML yang dibuat oleh James Clark, yang juga digunakan oleh browser web Mozilla. Fungsi parser expat ini disertakan mulai PHP 4, dikenal juga sebagai fungsi parser SAX (Simple API for XML).
PHP melakukan proses yang disebut dengan parsing dengan menggunakan fungsi expat ini, hasil parsing dokumen XML ini yang kemudian dikirimkan kepada browser web dalam bentuk dokumen HTML. Format hasil yang dikirimkan kepada browser selalu harus dalam bentuk dokumen HTML, karena browser web secara default hanya dapat menampilkan data text dengan format HTML.
Jika kita menggunakan Apache di lingkungan *nix, maka kita dapat melakukan integrasi librari ini dengan melakukan pengkonfigurasian dengan perintah seperti berikut (tergantung pada versi Apache yang kita gunakan):
./configure --enable-xml -with-apache=../apache_1.3.12
Jika kita menggunakan PHP 3 dan Apache 1.3.7, maka fungsi untuk XML expat ini ada pada librari Apache.
Keterbatasan pada fungsi expat pada PHP sama dengan keterbatasan dari fungsi expat itu sendiri. Salah satu contohnya adalah keterbatasan tidak dapat melakukan validasi DTD, karena memang parser tidak dirancang untuk menjadi validator.
Jika kita menggunakan PHP 4 pada Windows maka fungsi expat untuk melakukan parsing dokumen XML tersedia dalam paket instalasinya, sudah merupakan fungsi internal dari PHP.
Untuk menggunakan fungsi parser ini, maka kita harus membuat class sendiri untuk membungkus objek dan method untuk memroses dan atau menampilkan data dari file XML.
Fungsi expat bekerja dengan melakukan penelusuran dokumen XML, kemudian akan melakukan pemanggilan fungsi khusus jika menemukan berbagai jenis tag. Sebagai contoh, kita akan memanggil sebuah fungsi khusus untuk memroses tag pembuka, kemudian kita akan memanggil sebuah fungsi yang lainnya untuk memroses tag akhir (penutup), dan kita bisa memanggil fungsi yang digunakan untuk memroses data di antara tag pembuka dan tag penutup.
Parser bertanggung jawab untuk melakukan pemisahan data dalam dokumen, fungsi bertanggung jawab untuk melakukan pemrosesan tag-tag yang ditemukan. Setiap tag selesai diproses, parser melanjutkan untuk elemen dalam dokumen berikutnya untuk diproses, demikian seterusnya parser bekerja secara berulang dengan sendirinya, sampai dengan tidak ada elemen lagi yang diproses.
Langkah-langkah penggunaan parser expat:
- Buat objek (instance) parser XML, dengan menggunakan fungsi xml_parser_create(). Objek ini selanjutnya akan digunakan oleh semua fungsi parser yang berkaitan.
- Menyiapkan fungsi/callback yang akan dipanggil oleh fungsi expat apabila terjadi event.
- Fungsi expat tidak memiliki exception, tetapi memiliki 7 kemungkinan event.
Dalam bab ini kita hanya akan menggunakan beberapa event saja, agar dapat dengan mudah dipahami penggunaan fungsi expat ini, yaitu xml_set_elemen_handler() dan xml_set_character_data_handler().
Kerangka pemroses dokumen XML dengan parser expat:
<?
// Mendefinisikan fungsi-fungsi yang akan dipanggil oleh xml_parser expat
function startElemen() {
}
function endElemen() {
}
function characterData () {
}
// mendefinisilan file data XML yang akan diproses
// - misalnya katalog_1.xml
$fileXML=" katalog_1.xml";
// inisialisasi parser
$xml_parser=xml_parser_create ( ) ;
// mendefinisikan agar elemen yang ditemukan tidak dikonversi
// menjadi huruf kapital (case folding)
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, FALSE) ;
// mengatur pemanggilan fungsi callback
xml_set_element_handler($xml_parser, "startElement", "endElement") ;
xml_set_character_data_handler($xml_parser, "characterData") ;
// Buka file data XML
if (!prosesfile=fread($fileXML,"r"))
echo ("File tidak ditemukan! Proses tidak dapat dilanjutkan") ;
} else {
// Baca file data XML dan memparse datanya
while ($data=fread($prosesfile,4096)) {
// mengantisipasi kesalahan
if (!xml_parse($xml_parse, $data, feof ($prosesfile))) {
die(sprintf("XML error: %s pada baris %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser))); }
}
}
// Membuang objek parser
xml_parser_free($xml_parser);
?>
Skema script tadi menunjukkan alur pengkonversian dokumen XML menjadi dokumen lain, umumnya skema di atas digunakan untuk mengkonversi dokumen XML menjadi dokumen HTML.
Pada bagian paling atas kita mendefinisikan variabel dan fungsi yang akan digunakan oleh parser xml.
Variabel global yang kita definisikan adalah $currentTag yang digunakan untuk menyimpan informasi tag yang sedang diproses.
Pada setiap fungsi yang menggunakan variabel $currentTag, fungsi tersebut dapat mengaksesnya dengan sebelumnya mendeklarasikan dengan perintah global $currentTag.
$xml_parser=xml_parser_create ( )
merupakan fungsi yang digunakan untuk menginisialisasi parser, nama parser yang kita buat adalah $xml_parser.
xml_parser_set_option($xml_parser,
XML_OPTION_CASE_FOLDING, FALSE)
merupakan fungsi yang mematikan atau mencegah proses
penterjemahan tag yang ditemukan menjadi huruf kapital, karena
standar tag dalam xml dapat menggunakan huruf besar ataupun kecil.
xml_set_elemen_handler($xml_palser,"startElement","endElement")
mendefinisikan fungsi yang akan dipanggil, jika tag ditemukan.
Parser akan memanggil Fungsi startElement()jika ditemukan tag
awal, dan (pembuka), kemudian parser akan memanggil endElement()jika parser
menemukan tag penutup.
Fungsi startElement() akan melakukan proses yang kita definisikan
apabila tag awal ditemukan.
Fungsi endElement() akan melakukan proses yang kita definisikan
apabila tag penutup ditemukan.
xml_set_character_data_handler($xml_parser,"characterData")
mendefinisikan pemanggilan fungsi characterData() apabila
parser menemukan data karakter, data yang ada di antara
sepasang tag yang sesuai (tag pembuka dan penutupnya).
Fungsi characterData() akan melakukan proses yang didefinisikan
untuk pemrosesan data karakter yang ada di antara dua tag.
Setelah pendefinisian fungsi untuk event dari proses parser, berikutnya adalah kita membaca file data XML yang akan diproses. Jika file data ada pada PATH yang didefinisikan, maka berikutnya adalah melakukan proses pembacaan dengan menggunakan fungsi fread(). Hasil dari pembacaan kemudian diproses oleh parser, sampai dengan tidak ada lagi data yang dapat dibaca dari file.
Setiap parser melakukan proses, parser akan memberikan informasi keberhasilan proses parse, jika terdapat kesalahan, maka proses parser dapat dihentikan dengan proses die(), dengan menampilkan pesan kesalahan. Pesan kesalahan dari parser dapat diambil dengan menggunakan fungsi berikut:
- xml_error_string() digunakan untuk menampilkan deskripsi kesalahan
- xml_get_error_code() untuk menampilkan kode pesan kesalahan
- xml_get_current_line_number() untuk menampilkan nomor baris tempat terjadi kesalahan.
- xml_parser_free($xml_parser) digunakan untuk menghapus objek parser yang kita gunakan, untuk membebaskan memori komputer dari program kita, agar dapat digunakan oleh proses lain sistem.
Pada contoh yang akan kita bahas saat ini, kita akan mencoba menampilkan dokumen katalog_1.xml di browser web dengan menggunakan elemen tabel.
Sehingga kita hanya perlu membuat fungsi startElement() agar menampilkan tag <table> untuk nama tag katalog, dan tag <tr> untuk nama tag buku, dan tag <td> untuk semua tag selain nama tag katalog dan tag buku.
Fungsi startElement() akan memiliki parameter $parser, $name, dan $attr, menjadi startElement($parser, $name, $attr). $parser adalah objek parser kita, $name adalah nama tag, dan $attr adalah atribut dari tag. Pada pembahasan ini kita hanya berkepentingan dengan $name, yaitu nama tag yang akan kita proses.
Contoh startElement($parser, $name, $attr)
function startElement($parser, $name, $attrs) {
global $currentTag;
$currentTag = $name;
// $name=strtolower ($name);
// output opening HTML tags
switch ($name) {
case "katalog":
echo "<table>";
break;
case "buku":
echo "<tr>";
break;
default:
echo "<td>";
break;
}
}
Dalam fungsi endElement() kita akan membuat fungsi untuk menampilkan tag </table> untuk nama tag katalog, dan tag </tr> untuk nama tag buku, dan tag </td> untuk semua tag selain nama tag katalog dan tag buku.
Fungsi endElement() akan memiliki parameter $parser dan $name, menjadi endElement($parser, $name). $parser adalah nama objek parser kita, dan $name adalah nama tag yang akan kita proses.
Contoh endElement($parser, $name)
function endElement($parser, $name) {
global $currentTag;
// output closing HTML tags
// $name=strtolower($name);
switch ($name) {
case "katalog":
echo "</table>";
break;
case "buku":
echo "</tr>";
break;
default:
echo "</td>";
break;
}
// clear current tag variable
$currentTag = "";
}
Kemudian kita membuat fungsi characterData() yang menampilkan isi dari data karakter yang ada diantara dua tag yang ditemukan. Fungsi ini memiliki parameter $parser dan $data, sehingga menjadi characterData($parser, $data). $parser adalah nama objek parser kita, dan $data adalah data karakter yang akan kita proses.
Menggunakan DOM
Ekstensi DOM (Document Object Model) memungkinkan file XML menjadi pohon objek (object tree) DOM dan memanipulasi pohon tersebut. PHP menggunakan ekstensi DOM dari projek GNOME:libxml, yang menggunakan parser XML W3C, fungsi ini ada pada PHP yang dikonfigurasi dengan menggunakan -with-dom= [DIR] yang merupakan librari XML GNOME.
Untuk pemakai PHP di lingkungan Windows, PHP memiliki modul extension php_domxml.dll dan iconv.dll, kedua modul ini harus diaktifkan dan disalinkan ke dalam direktori system32 di bawah direktori sistem windows kita. Penulis menggunakan Windows 2000 server, kedua file tersebut penulis simpan dan salinkan di bawah direktori c:\winnt\system32. Sumber untuk file php_domxml.dll tersedia di bawah direktori extensions di bawah direktori php, sedangkan iconv.dll ada di bawah direktori dlls yang ada pada direktori php.
Jangan lupa perbaiki isi file PHP.INI dengan tanda titik koma (;) di depan extension=php_domxml.dll dihilangkan. Pastikan extension_dir= c:\php\extensions.
Akan tetapi harus diwaspadai, ekstensi DOMXML yang ada pada PHP masih dalam tahap experimental, sehingga bisa terjadi perubahan method atau property (fungsi dan variabel, lihat pembahasan tentang class pada bab pemrograman berorientasi objek) secara tiba-tiba dan kita tidak mendapatkan pemberitahuan perubahan tersebut. Hal ini baru akan diketahui pada saat kita menggunakan versi yang terbaru. Demikian juga yang dialami penulis, ekstensi PHP untuk DOMXML yang digunakan masih yang lama, pada saat buku ini disusun dan diperiksa kembali programnya ternyata ada perubahan.
Jadi dalam buku ini penjelasan DOMXML masih mengacu pada versi PHP 4.2.1, sesuai dengan referensi online yang penulis lihat pada saat penyusunan buku ini (akhir Juni 2004). Penjelasan akan menggunakan method dan property yang ada pada referensi online dan file help. Sehingga jika ada perubahan, harap dimaklumi, karena sesuai pesan resmi dari situs PHP, bisa saja terjadi perubahan yang mendadak pada librari fungsi ini karena masih tahap eksperimen. Penulis menggunakan versi PHP 4.3.6 untuk menguji proses pembacaan dokumen XML dengan menggunakan PHP berikut:
Salah satu cara atau langkah-langkah yang diperlukan untuk membaca data file XML:
- Pembacaan file XML dengan menggunakan method domxml_open_file(), hasilnya akan berupa objek pohon data XML
- Objek pohon data adalah array objek
- Melakukan pemrosesan setiap elemen array objek data XML sesuai dengan kebutuhan
Pembacaan File XML
Buka file XML dengan menggunakan domxml_open_file("Namafile.XML"), variabel yang digunakan untuk menyimpan hasil pembacaan file ini akan berupa variabel objek pohon (tree) dokumen XML.
Sintaks:
$varObjDataXML=
domxml_open_file("Namafile.XML"[,option]);
Contoh:
$fileXML="c:\webapp\latihan\php\katalog_1.xml"
$xmldoc=domxml_open_file($fileXML);
Metode pembacaan yang dilakukan di atas adalah metode pembacaan standar, harus dilengkapi dengan penggunaan option yang memungkinkan dokumen XML yang terbaca menjadi objek dokumen yang murni data XML, tidak ada data ganti baris (new line), baris kosong, atau pun spasi.
Metode pembacaan yang memungkinkan penghilangan spasi dan ganti baris, dapat dilakukan seperti berikut:
$fileDataXML="c:\webapp\latihan\php\katalog_1.xml";
$XMLdoc=domxml_open_file($fileDataXML,
DOMXML_LOAD_PARSING +
DOMXML_LOAD_COMPLETE_ATTRS +
DOMXML_LOAD_SUBSTITUTE_ENTITIES +
DOMXML_LOAD_DONT_KEEP_BLANKS );
Kode di atas, belum dapat penulis jelaskan, karena dokumentasi PHP yang ada tidak menjelaskannya, teknik ini diperoleh penulis dari situs web yang menjelaskan permasalahan yang terjadi apabila tidak diantisipasi dengan teknik membaca di atas.
Setelah berhasil dibaca dari file dan dilakukan pembuatan objek oleh fungsi domxml_open_file() di atas, kita akan mendapatkan sebuah variabel array asosiatif objek.
Berikutnya adalah kita melakukan pemrosesan terhadap data yang telah berada pada variabel array, dalam contoh ini adalah $XMLdoc.
Pemrosesan Pohon Data XML
Setelah kita memiliki variabel objek data XML, maka kita dapat melakukan pemrosesan terhadap data yang ada pada variabel objek data XML tersebut dengan menggunakan method (fungsi) yang dimiliki oleh variabel objek tersebut.
Umumnya, elemen pertama dari dokumen XML adalah nama tag yang mewakili jenis data, kemudian memiliki sekumpulan elemen anak yang mewakili jenis data tersebut. Setiap elemen anak ini akan memiliki data yang menunjukkan informasi tentang data tersebut.
Sebagai contoh kita memiliki data dalam file katalog_1.xml yang ada pada awal bab ini. Kita memiliki jenis data katalog, yang berisi informasi tentang buku, setiap data buku memiliki data tentang buku tersebut.
Kita akan melakukan pemrosesan data katalog_1.xml, maka kita akan membaca elemen pertama, yang akan disebut elemen akar (root), kemudian kita membaca anak elemen akar tersebut, yaitu elemen buku. Setelah kita mendapatkan elemen buku, kita dapat membaca berikutnya semua elemen anak dari setiap buku.
Contoh:
/ / baca elemen akar -> mendapatkan elemen katalog
$akar=xmldoc->document_element();
Method document_element() digunakan untuk mendapatkan elemen pertama dari dokumen XML, dalam contoh pembahasan ini adalah elemen katalog, hasil dari berupa objek katalog yang disimpan dalam $akar, yang terdiri dari data buku.
/ / Mendapatkan semua data anak -> buku
$buku=$akar->child_nodes();
/ / hitung ada berapa data tentang buku
$jbuku=count($buku);
Kita menggunakan method child_nodes() pada elemen akar, untuk mendapatkan semua data objek tentang buku, hasilnya berupa array objek, dalam hal ini adalah array $buku.
Kita menggunakan fungsi count() untuk menghitung ada berapa jumlah data objek buku, yang diwakili ada berapa elemen array objek yang disimpan dalam array objek $buku, hasil dari fungsi count() disimpan dalam $jbuku.
Jika $jbuku bernilai o, maka tidak ada data buku. Jika lebih besar dari o, maka proses dilanjutkan untuk memroses data setiap objek buku.
Kita dapat menggunakan struktur for() untuk melakukan proses untuk setiap data buku. Setiap elemen $buku kemudian diproses, dengan menggunakan method child_nodes() untuk mendapatkan berapa banyak item informasi tentang buku tersebut.
for ($i=0;$i<$jbuku;$i++){
$infobuku=$buku[$i]->child_nodes();
/ / menampilkan data info setiap buku
foreach($infobuku as $elemen) (
echo $elemen->get_content();
}
}
Setiap elemen dari $buku dengan method child_nodes() dimasukkan ke dalam $infobuku sebagai array objek juga. Kemudian kita gunakan struktur kendali foreach untuk memroses setiap elemen array $infobuku, dengan menggunakan method get_content() kita menampilkan isi dari semua elemen $infobuku.
Berikut ini script lengkap untuk menampilkan data dari katalog_1.xml dengan menggunakan extensi PHP DOMXML:
Nama file script: xml_domxml.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional// EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
HTML (HyperText Markup Language) merupakan bahasa yang dikenal untuk melakukan pengemasan dan penyajian informasi dalam web, seperti halnya yang kita pelajari dalam buku ini, bagaimana menghasilkan dokumen HTML secara dinamik dengan menggunakan PHP. Dalam HTML kita menggunakan tag-tag yang telah ditentukan, tag-tag yang merupakan bahasa markup, menandai dokumen memiliki elemen apa saja, kemudian bagaimana harus ditampilkan dalam browser web.
XML merupakan format penyimpanan data standar, mudah untuk melakukan saling tukar (pertukaran) data. Dokumen XML berisi suatu metadata, data yang memiliki penjelasan (informasi) tentang data itu sendiri. XML dapat disebut juga sebagai 'metalanguage' suatu bahasa yang digunakan untuk mendefinisikan bahasa yang lain.
Kata extensible menunjukkan suatu fasilitas yang memungkinkan kita untuk menambah atau mendefinisikan 'bahasa markup' sendiri, bukan seperti HTML yang hanya memiliki tag untuk mendefinisikan elemen dokumen, yang menunjukkan tanda bagaimana ditampilkan dalam browser web.
XML secara umum digunakan untuk mendefinisikan bagaimana informasi secara terstruktur disimpan. XML digunakan sebagai format untuk pertukaran data, memungkinkan data dari satu sistem dibaca oleh sistem lain. XML disimpan sebagai file teks (ASCII) biasa.
PHP sebagai bahasa scripting dapat digunakan untuk melakukan pemrosesan data dalam format XML. Pada bab ini dibahas bagaimana menggunakan PHP untuk melakukan pemrosesan data berasal dari dokumen XML kemudian ditampilkan dalam browser web.
Dokumen XML
Dokumen XML merupakan file teks (ASCII) biasa, di dalamnya berisi metadata, data yang memiliki informasi tentang data itu sendiri. Informasi tentang data dinyatakan dalam tag-tag, data untuk setiap informasi disimpan diantara tag-tag.
HTML memiliki tag-tag yang telah didefinisikan oleh W3C (konsonium standardisasi teknologi web, termasuk HTML), browser web dapat dengan mudah bagaimana menampilkan informasi dari dokumen HTML berdasarkan tag-tag yang ada di dalamnya. Isi dokumen XML juga memiliki tag-tag. Tag yang ada dalam dokumen XML dapat didefinisikan sendiri, artinya kita dapat membuat tag-tag sendiri untuk menggambarkan data yang ada dalam dokumen XML tersebut.
Beberapa standar XML telah berhasil didefinisikan dan berlaku secara internasional, contohnya adalah XML untuk berita, dikenal sebagai XMLnews. Selain itu ada juga standar XML yang digunakan untuk kebutuhan transaksi untuk e-commerce, standar XML ini hanya berlaku untuk komunitas e-commerce yang bersangkutan, tetapi secara prinsip sebenarnya sudah ada standar data dalam format XML yang harus diikuti oleh komunitas tersebut.
Sebenarnya masih banyak lagi standar data yang telah dibuat dengan menggunakan format XML. Dokumen atau data dalam XML dapat dikatakan sebagai suatu database tersendiri dengan format yang sangat general dan dapat dengan mudah disadur atau diambil untuk kebutuhan sistem informasi manajemen.
Tag-tag dalam XML memiliki aturan yang sama seperti halnya tag HTML, hanya saja nama tag dapat didefinisikan sendiri. Pembahasan bab XML dalam buku ini akan mencontohkan pada bagaimana membuat dokumen XML untuk katalog buku.
Katalogsuatu buku umumnya memiliki informasi:
- ISBN (no registrasi buku)
- Topik buku (klasifikasi berdasarkan topik)
- Judul buku
- Penulis
- Penerbit
- Tahun terbit
- Dan lain-lain
File daftar katalog buku, dengan informasi setiap data buku nomor buku sampai dengan informasi tahun terbit seperti di atas, adalah sebagai berikut, dapat dalam bentuk sebagai berikut:
ISBN : PW-001
Klasifikasi : Pemrograman Komputer
Judul : Dasar Pemrograman Web dengan HTML
Penulis : Betha Sidik dan Husni Pohan
Penerbit : CV Informatika
Tahun Terbit : 2001
ISBN : PW-002
Klasifikasi : Pemrograman Komputer
Judul : Pemrograman Web dengan PHP
Penulis : Betha Sidik
Penerbit : CV Informatika
Tahun : 2001
ISBN : PW-003
Klasifikasi : Database Komputer
Judul : MySQL
Penulis : Betha Sidik
Penerbit : CV Informatika
Tahun Terbit : 2003
Data katalog buku di atas jika ditampilkan dengan menggunakan HTML maka kita akan memiliki dua macam dokumen HTML, pertama adalah dokumen HTML yang digunakan untuk menampilkan katalog dengan informasi setiap buku dinyatakan dalam beberapa baris, dan yang kedua kita akan membuat tabel daftar katalog buku dengan menggunakan tag table HTML.
Berikut adalah contoh HTML untuk membuat dokumen HTML untuk membuat dokumen HTML seperti di atas:
HTML untuk model penyajian katalog yg contoh kesatu:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<html>
<head>
<title>Katalog Buku v l</title>
</head>
<body>
<h1>Daftar Katalog Buku</h1>
<hr>
<p>
ISBN: PW-001
<br>
Klasifikasi: Pemrograman Komputer
<br>
Judul: Dasar Pemrograman Web dengan HTML
<br>
Penulis : Betha Sidik dan Husni Pohan
<br>
Penerbit : CV Informatika
<br>
Tahun Terbit: 2001
</p>
<p>
ISBN: PW-002
<br>
Klasifikasi : Pemrograman Komputer
<br>
Judul : Pemrograman Web dengan PHP
<br>
Penulis : Betha Sidik
<br>
Penerbit : CV Informatika
<br>
Tahun Terbit : 2001
</p>
<p>
ISBN: PW-003
<br>
Judul : MySQL
<br>
Penulis : Betha Sidik
<br>
Penerbit : CV Informatika
<br>
Tahun Terbit : 2003
</p>
<hr>
</body>
</html>
HTML untuk menyajikan daftar katalog buku contoh kedua dengan menggunakan elemen table HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<html>
<head>
<title>Katalog Buku v 2</title>
</head>
<body>
<hl>Daftar Katalog Buku</hl>
<hr>
<table>
<tr>
<td>ISBN</td>
<td>Klasifikasi</td>
<td>Judul</td>
<td>Penulis</td>
<td>Penerbit</td>
<td>Tahun Terbit</td>
</tr>
<tr>
<td>PW-001</td>
<td>Pemrograman Komputer</td>
<td>Dasar Pemrograman Web dengan HTML</td>
<td>Betha Sidik dan Husni Pohan</td>
<td>CV Informatika</td>
<td>2001</td>
</tr>
<tr>
<td>PW-002</td>
<td>Pemrograman Komputer</td>
<td>Pemrograman Web dengan HTML</td>
<td>Betha Sidik</td>
<td>CV Informatika</td>
<td>2001</td>
</tr>
<tr>
<td>PW-003</td>
<td>Database Komputer</td>
<td>MySQL</td>
<td>Betha Sidik</td>
<td>CV Informatika</td>
<td>2003</td>
</tr>
</table>
</body>
</html>
Contoh dokumen HTML di atas, menunjukkan bagaimana kita dapat menyajikan daftar katalog buku dengan menggunakan tag-tag HTML, sehingga dapat ditampilkan dalam browser.
Contoh Dokumen XML
Berikut adalah dokumen XML sederhana untuk membuat daftar katalog buku (beri nama file XML yang dibuat dengan nama katalog_1.xml):
<?xml version="1.0" encoding="ISO-8859-1"?>
<katalog>
<buku>
<isbn>PW-001</isbn>
<klasifikasi>Pemrograman Komputer</klasifikasi>
<judul>Dasar Pemrogaman Web dengan HTML</judul>
<penulis>Betha Sidik dan Husni Pohan</penulis>
<penerbit>CV Informatika</penerbit>
<tahun>2001</tahun>
</buku>
<buku>
<isbn>PW-002</isbn>
<klasifikasi>Perograman Komputer</klasifikasi>
<judul>Pemrograman Web dengan PHP</judul>
<penulis>Betha Sidik</penulis>
<penerbit>CV Informatika</penerbit>
<tahun>2001</tahun>
</buku>
<buku>
<isbn>PW-003</isbn>
<klasifikasi>Database Komputer</klasifikasi>
<judul>MySQL</judul>
<penulis>Betha Sidik</penulis>
<penerbit>CV Informatika</penerbit>
<tahun>2003</tahun>
</buku>
</katalog>
Berdasarkan contoh dokumen XML daftar katalog buku di atas, kita dapat melihat bahwa tag-tag yang digunakan dalam file katalog_1.xml, murni bukanlah tag-tag HTML, tetapi merupakan tag-tag yang kita definisikan sendiri.
Tag diawali dengan nama tag, kemudian diakhiri dengan garis miring dan diikuti dengan nama tag. Nama tag selalu diapit dengan tanda kurung sudut lebih kecil (<) dan tanda kurung sudut lebih besar (>), menjadi <namatag> dan diakhiri dengan </namatag>. Tag selalu berpasangan.
Khusus untuk baris pertama, kita perlu menuliskannya, untuk mendeklarasikan XML, yang berisi versi XML dan pengkodean karakter yang digunakan dalam dokumen ini. Dalam kasus ini, dokumen XML yang didefinisikan sesuai dengan spesifikasi XML versi 1.0 dan pengkodean karakter yang digunakan adalah ISO-8859-1.
Pada contoh di atas, tag <katalog> adalah nama tag utama dalam dokumen XML yang menyatakan isi dari dokumen XML adalah data katalog, kemudian diikuti dengan tag-tag yang menyatakan informasi dari data buku, diawali dengan tag <buku>, yaitu no ISBN, klasifikasi buku, judul buku, penulis, penerbit, dan tahun diterbitkan. </buku> merupakan tag akhir tag <buku>, yang menunjukkan informasi dari setiap buku. </katalog>menunjukkan akhir dari data katalog.
Penulisan tag pembuka dan tag penutup harus ditulis dengan besar huruf yang sama, dengan huruf kecil semua, atau huruf besar semua, atau campuran. Secara prinsip harus sama cara penulisannya, karena 'case sensitive'.
Menampilkan Dokumen XML dalam Browser
Karena browser adalah aplikasi yang digunakan untuk menampilkan informasi dari dokumen HTML, maka setiap dokumen XML yang akan disajikan oleh browser harus terlebih dahulu diproses sehingga tag XML yang belum dikenal oleh browser dapat dimengerti oleh browser web, sehingga browser web dapat menampilkan isi dari dokumen XML tersebut atau dengan melakukan penterjemahan dari tag XML menjadi tag HTML dengan format yang didefinisikan oleh pemrogramannya.
PHP sering dikenal sebagai bahasa pemrograman yang mengimplementasi teknologi baru, termasuk XML sejak Desember 1998, pada PHP versi 3.06.
Penanganan dokumen XML oleh PHP dapat dilakukan dengan salah satu cara berikut:
- Secara manual dengan membuat aplikasi PHP sendiri.
- Dengan menggunakan fungsi expat atau SAX,
- DOM (Document Object Model), PHP class untuk XML,
- atau menggunakan objek Java.
Penanganan secara manual XML dengan membuat script PHP secara murni, akan tetapi kini, membuat fungsi PHP sendiri tidak perlu dilakukan, karena PHP telah menyediakan fungsi-fungsinya.
Setiap isi dokumen HTML yang akan ditampilkan dalam browser web akan diproses dengan menggunakan prosesor XML, yang sering disebut dengan parser XML.
Dua macam parser XML dasar:
- Parser berbasis pohon (tree based parser)
Parser ini akan mentransformasikan dokumen XML ke dalam struktur pohon. Parser jenis ini akan menganalisis seluruh dokumen, hasilnya akan dapat diakses oleh suatu librari API berupa struktur pohon, secara standar umum dikenal dengan Document Object Model (DOM).
- Parser berbasis event (event based parser)
Parser ini akan mentransformasikan dokumen XML menjadi serangkaian event. Jika ada suatu event terjadi maka event ini akan memanggil fungsi yang disediakan oleh developer untuk menanganinya.
Pada bab ini akan dibahas dua macam parser dasar, yang akan menterjemahkan dokumen XML menjadi dokumen HTML:
- Parser dengan menggunakan fungsi expat (SAX), tergolong parser berbasis event
- Parser dengan Menggunakan fungsi DOM, tergolong pada parser berbasis pohon.
Fungsi Expat (SAX) untuk XML
Fungsi expat digunakan untuk melakukan proses parsing dokumen XML. Fungsi ini diadopsi dari librari C untuk parser XML yang dibuat oleh James Clark, yang juga digunakan oleh browser web Mozilla. Fungsi parser expat ini disertakan mulai PHP 4, dikenal juga sebagai fungsi parser SAX (Simple API for XML).
PHP melakukan proses yang disebut dengan parsing dengan menggunakan fungsi expat ini, hasil parsing dokumen XML ini yang kemudian dikirimkan kepada browser web dalam bentuk dokumen HTML. Format hasil yang dikirimkan kepada browser selalu harus dalam bentuk dokumen HTML, karena browser web secara default hanya dapat menampilkan data text dengan format HTML.
Jika kita menggunakan Apache di lingkungan *nix, maka kita dapat melakukan integrasi librari ini dengan melakukan pengkonfigurasian dengan perintah seperti berikut (tergantung pada versi Apache yang kita gunakan):
./configure --enable-xml -with-apache=../apache_1.3.12
Jika kita menggunakan PHP 3 dan Apache 1.3.7, maka fungsi untuk XML expat ini ada pada librari Apache.
Keterbatasan pada fungsi expat pada PHP sama dengan keterbatasan dari fungsi expat itu sendiri. Salah satu contohnya adalah keterbatasan tidak dapat melakukan validasi DTD, karena memang parser tidak dirancang untuk menjadi validator.
Jika kita menggunakan PHP 4 pada Windows maka fungsi expat untuk melakukan parsing dokumen XML tersedia dalam paket instalasinya, sudah merupakan fungsi internal dari PHP.
Untuk menggunakan fungsi parser ini, maka kita harus membuat class sendiri untuk membungkus objek dan method untuk memroses dan atau menampilkan data dari file XML.
Fungsi expat bekerja dengan melakukan penelusuran dokumen XML, kemudian akan melakukan pemanggilan fungsi khusus jika menemukan berbagai jenis tag. Sebagai contoh, kita akan memanggil sebuah fungsi khusus untuk memroses tag pembuka, kemudian kita akan memanggil sebuah fungsi yang lainnya untuk memroses tag akhir (penutup), dan kita bisa memanggil fungsi yang digunakan untuk memroses data di antara tag pembuka dan tag penutup.
Parser bertanggung jawab untuk melakukan pemisahan data dalam dokumen, fungsi bertanggung jawab untuk melakukan pemrosesan tag-tag yang ditemukan. Setiap tag selesai diproses, parser melanjutkan untuk elemen dalam dokumen berikutnya untuk diproses, demikian seterusnya parser bekerja secara berulang dengan sendirinya, sampai dengan tidak ada elemen lagi yang diproses.
Langkah-langkah penggunaan parser expat:
- Buat objek (instance) parser XML, dengan menggunakan fungsi xml_parser_create(). Objek ini selanjutnya akan digunakan oleh semua fungsi parser yang berkaitan.
- Menyiapkan fungsi/callback yang akan dipanggil oleh fungsi expat apabila terjadi event.
- Fungsi expat tidak memiliki exception, tetapi memiliki 7 kemungkinan event.
Dalam bab ini kita hanya akan menggunakan beberapa event saja, agar dapat dengan mudah dipahami penggunaan fungsi expat ini, yaitu xml_set_elemen_handler() dan xml_set_character_data_handler().
Kerangka pemroses dokumen XML dengan parser expat:
<?
// Mendefinisikan fungsi-fungsi yang akan dipanggil oleh xml_parser expat
function startElemen() {
}
function endElemen() {
}
function characterData () {
}
// mendefinisilan file data XML yang akan diproses
// - misalnya katalog_1.xml
$fileXML=" katalog_1.xml";
// inisialisasi parser
$xml_parser=xml_parser_create ( ) ;
// mendefinisikan agar elemen yang ditemukan tidak dikonversi
// menjadi huruf kapital (case folding)
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, FALSE) ;
// mengatur pemanggilan fungsi callback
xml_set_element_handler($xml_parser, "startElement", "endElement") ;
xml_set_character_data_handler($xml_parser, "characterData") ;
// Buka file data XML
if (!prosesfile=fread($fileXML,"r"))
echo ("File tidak ditemukan! Proses tidak dapat dilanjutkan") ;
} else {
// Baca file data XML dan memparse datanya
while ($data=fread($prosesfile,4096)) {
// mengantisipasi kesalahan
if (!xml_parse($xml_parse, $data, feof ($prosesfile))) {
die(sprintf("XML error: %s pada baris %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser))); }
}
}
// Membuang objek parser
xml_parser_free($xml_parser);
?>
Skema script tadi menunjukkan alur pengkonversian dokumen XML menjadi dokumen lain, umumnya skema di atas digunakan untuk mengkonversi dokumen XML menjadi dokumen HTML.
Pada bagian paling atas kita mendefinisikan variabel dan fungsi yang akan digunakan oleh parser xml.
Variabel global yang kita definisikan adalah $currentTag yang digunakan untuk menyimpan informasi tag yang sedang diproses.
Pada setiap fungsi yang menggunakan variabel $currentTag, fungsi tersebut dapat mengaksesnya dengan sebelumnya mendeklarasikan dengan perintah global $currentTag.
$xml_parser=xml_parser_create ( )
merupakan fungsi yang digunakan untuk menginisialisasi parser, nama parser yang kita buat adalah $xml_parser.
xml_parser_set_option($xml_parser,
XML_OPTION_CASE_FOLDING, FALSE)
merupakan fungsi yang mematikan atau mencegah proses
penterjemahan tag yang ditemukan menjadi huruf kapital, karena
standar tag dalam xml dapat menggunakan huruf besar ataupun kecil.
xml_set_elemen_handler($xml_palser,"startElement","endElement")
mendefinisikan fungsi yang akan dipanggil, jika tag ditemukan.
Parser akan memanggil Fungsi startElement()jika ditemukan tag
awal, dan (pembuka), kemudian parser akan memanggil endElement()jika parser
menemukan tag penutup.
Fungsi startElement() akan melakukan proses yang kita definisikan
apabila tag awal ditemukan.
Fungsi endElement() akan melakukan proses yang kita definisikan
apabila tag penutup ditemukan.
xml_set_character_data_handler($xml_parser,"characterData")
mendefinisikan pemanggilan fungsi characterData() apabila
parser menemukan data karakter, data yang ada di antara
sepasang tag yang sesuai (tag pembuka dan penutupnya).
Fungsi characterData() akan melakukan proses yang didefinisikan
untuk pemrosesan data karakter yang ada di antara dua tag.
Setelah pendefinisian fungsi untuk event dari proses parser, berikutnya adalah kita membaca file data XML yang akan diproses. Jika file data ada pada PATH yang didefinisikan, maka berikutnya adalah melakukan proses pembacaan dengan menggunakan fungsi fread(). Hasil dari pembacaan kemudian diproses oleh parser, sampai dengan tidak ada lagi data yang dapat dibaca dari file.
Setiap parser melakukan proses, parser akan memberikan informasi keberhasilan proses parse, jika terdapat kesalahan, maka proses parser dapat dihentikan dengan proses die(), dengan menampilkan pesan kesalahan. Pesan kesalahan dari parser dapat diambil dengan menggunakan fungsi berikut:
- xml_error_string() digunakan untuk menampilkan deskripsi kesalahan
- xml_get_error_code() untuk menampilkan kode pesan kesalahan
- xml_get_current_line_number() untuk menampilkan nomor baris tempat terjadi kesalahan.
- xml_parser_free($xml_parser) digunakan untuk menghapus objek parser yang kita gunakan, untuk membebaskan memori komputer dari program kita, agar dapat digunakan oleh proses lain sistem.
Pada contoh yang akan kita bahas saat ini, kita akan mencoba menampilkan dokumen katalog_1.xml di browser web dengan menggunakan elemen tabel.
Sehingga kita hanya perlu membuat fungsi startElement() agar menampilkan tag <table> untuk nama tag katalog, dan tag <tr> untuk nama tag buku, dan tag <td> untuk semua tag selain nama tag katalog dan tag buku.
Fungsi startElement() akan memiliki parameter $parser, $name, dan $attr, menjadi startElement($parser, $name, $attr). $parser adalah objek parser kita, $name adalah nama tag, dan $attr adalah atribut dari tag. Pada pembahasan ini kita hanya berkepentingan dengan $name, yaitu nama tag yang akan kita proses.
Contoh startElement($parser, $name, $attr)
function startElement($parser, $name, $attrs) {
global $currentTag;
$currentTag = $name;
// $name=strtolower ($name);
// output opening HTML tags
switch ($name) {
case "katalog":
echo "<table>";
break;
case "buku":
echo "<tr>";
break;
default:
echo "<td>";
break;
}
}
Dalam fungsi endElement() kita akan membuat fungsi untuk menampilkan tag </table> untuk nama tag katalog, dan tag </tr> untuk nama tag buku, dan tag </td> untuk semua tag selain nama tag katalog dan tag buku.
Fungsi endElement() akan memiliki parameter $parser dan $name, menjadi endElement($parser, $name). $parser adalah nama objek parser kita, dan $name adalah nama tag yang akan kita proses.
Contoh endElement($parser, $name)
function endElement($parser, $name) {
global $currentTag;
// output closing HTML tags
// $name=strtolower($name);
switch ($name) {
case "katalog":
echo "</table>";
break;
case "buku":
echo "</tr>";
break;
default:
echo "</td>";
break;
}
// clear current tag variable
$currentTag = "";
}
Kemudian kita membuat fungsi characterData() yang menampilkan isi dari data karakter yang ada diantara dua tag yang ditemukan. Fungsi ini memiliki parameter $parser dan $data, sehingga menjadi characterData($parser, $data). $parser adalah nama objek parser kita, dan $data adalah data karakter yang akan kita proses.
Menggunakan DOM
Ekstensi DOM (Document Object Model) memungkinkan file XML menjadi pohon objek (object tree) DOM dan memanipulasi pohon tersebut. PHP menggunakan ekstensi DOM dari projek GNOME:libxml, yang menggunakan parser XML W3C, fungsi ini ada pada PHP yang dikonfigurasi dengan menggunakan -with-dom= [DIR] yang merupakan librari XML GNOME.
Untuk pemakai PHP di lingkungan Windows, PHP memiliki modul extension php_domxml.dll dan iconv.dll, kedua modul ini harus diaktifkan dan disalinkan ke dalam direktori system32 di bawah direktori sistem windows kita. Penulis menggunakan Windows 2000 server, kedua file tersebut penulis simpan dan salinkan di bawah direktori c:\winnt\system32. Sumber untuk file php_domxml.dll tersedia di bawah direktori extensions di bawah direktori php, sedangkan iconv.dll ada di bawah direktori dlls yang ada pada direktori php.
Jangan lupa perbaiki isi file PHP.INI dengan tanda titik koma (;) di depan extension=php_domxml.dll dihilangkan. Pastikan extension_dir= c:\php\extensions.
Akan tetapi harus diwaspadai, ekstensi DOMXML yang ada pada PHP masih dalam tahap experimental, sehingga bisa terjadi perubahan method atau property (fungsi dan variabel, lihat pembahasan tentang class pada bab pemrograman berorientasi objek) secara tiba-tiba dan kita tidak mendapatkan pemberitahuan perubahan tersebut. Hal ini baru akan diketahui pada saat kita menggunakan versi yang terbaru. Demikian juga yang dialami penulis, ekstensi PHP untuk DOMXML yang digunakan masih yang lama, pada saat buku ini disusun dan diperiksa kembali programnya ternyata ada perubahan.
Jadi dalam buku ini penjelasan DOMXML masih mengacu pada versi PHP 4.2.1, sesuai dengan referensi online yang penulis lihat pada saat penyusunan buku ini (akhir Juni 2004). Penjelasan akan menggunakan method dan property yang ada pada referensi online dan file help. Sehingga jika ada perubahan, harap dimaklumi, karena sesuai pesan resmi dari situs PHP, bisa saja terjadi perubahan yang mendadak pada librari fungsi ini karena masih tahap eksperimen. Penulis menggunakan versi PHP 4.3.6 untuk menguji proses pembacaan dokumen XML dengan menggunakan PHP berikut:
Salah satu cara atau langkah-langkah yang diperlukan untuk membaca data file XML:
- Pembacaan file XML dengan menggunakan method domxml_open_file(), hasilnya akan berupa objek pohon data XML
- Objek pohon data adalah array objek
- Melakukan pemrosesan setiap elemen array objek data XML sesuai dengan kebutuhan
Pembacaan File XML
Buka file XML dengan menggunakan domxml_open_file("Namafile.XML"), variabel yang digunakan untuk menyimpan hasil pembacaan file ini akan berupa variabel objek pohon (tree) dokumen XML.
Sintaks:
$varObjDataXML=
domxml_open_file("Namafile.XML"[,option]);
Contoh:
$fileXML="c:\webapp\latihan\php\katalog_1.xml"
$xmldoc=domxml_open_file($fileXML);
Metode pembacaan yang dilakukan di atas adalah metode pembacaan standar, harus dilengkapi dengan penggunaan option yang memungkinkan dokumen XML yang terbaca menjadi objek dokumen yang murni data XML, tidak ada data ganti baris (new line), baris kosong, atau pun spasi.
Metode pembacaan yang memungkinkan penghilangan spasi dan ganti baris, dapat dilakukan seperti berikut:
$fileDataXML="c:\webapp\latihan\php\katalog_1.xml";
$XMLdoc=domxml_open_file($fileDataXML,
DOMXML_LOAD_PARSING +
DOMXML_LOAD_COMPLETE_ATTRS +
DOMXML_LOAD_SUBSTITUTE_ENTITIES +
DOMXML_LOAD_DONT_KEEP_BLANKS );
Kode di atas, belum dapat penulis jelaskan, karena dokumentasi PHP yang ada tidak menjelaskannya, teknik ini diperoleh penulis dari situs web yang menjelaskan permasalahan yang terjadi apabila tidak diantisipasi dengan teknik membaca di atas.
Setelah berhasil dibaca dari file dan dilakukan pembuatan objek oleh fungsi domxml_open_file() di atas, kita akan mendapatkan sebuah variabel array asosiatif objek.
Berikutnya adalah kita melakukan pemrosesan terhadap data yang telah berada pada variabel array, dalam contoh ini adalah $XMLdoc.
Pemrosesan Pohon Data XML
Setelah kita memiliki variabel objek data XML, maka kita dapat melakukan pemrosesan terhadap data yang ada pada variabel objek data XML tersebut dengan menggunakan method (fungsi) yang dimiliki oleh variabel objek tersebut.
Umumnya, elemen pertama dari dokumen XML adalah nama tag yang mewakili jenis data, kemudian memiliki sekumpulan elemen anak yang mewakili jenis data tersebut. Setiap elemen anak ini akan memiliki data yang menunjukkan informasi tentang data tersebut.
Sebagai contoh kita memiliki data dalam file katalog_1.xml yang ada pada awal bab ini. Kita memiliki jenis data katalog, yang berisi informasi tentang buku, setiap data buku memiliki data tentang buku tersebut.
Kita akan melakukan pemrosesan data katalog_1.xml, maka kita akan membaca elemen pertama, yang akan disebut elemen akar (root), kemudian kita membaca anak elemen akar tersebut, yaitu elemen buku. Setelah kita mendapatkan elemen buku, kita dapat membaca berikutnya semua elemen anak dari setiap buku.
Contoh:
/ / baca elemen akar -> mendapatkan elemen katalog
$akar=xmldoc->document_element();
Method document_element() digunakan untuk mendapatkan elemen pertama dari dokumen XML, dalam contoh pembahasan ini adalah elemen katalog, hasil dari berupa objek katalog yang disimpan dalam $akar, yang terdiri dari data buku.
/ / Mendapatkan semua data anak -> buku
$buku=$akar->child_nodes();
/ / hitung ada berapa data tentang buku
$jbuku=count($buku);
Kita menggunakan method child_nodes() pada elemen akar, untuk mendapatkan semua data objek tentang buku, hasilnya berupa array objek, dalam hal ini adalah array $buku.
Kita menggunakan fungsi count() untuk menghitung ada berapa jumlah data objek buku, yang diwakili ada berapa elemen array objek yang disimpan dalam array objek $buku, hasil dari fungsi count() disimpan dalam $jbuku.
Jika $jbuku bernilai o, maka tidak ada data buku. Jika lebih besar dari o, maka proses dilanjutkan untuk memroses data setiap objek buku.
Kita dapat menggunakan struktur for() untuk melakukan proses untuk setiap data buku. Setiap elemen $buku kemudian diproses, dengan menggunakan method child_nodes() untuk mendapatkan berapa banyak item informasi tentang buku tersebut.
for ($i=0;$i<$jbuku;$i++){
$infobuku=$buku[$i]->child_nodes();
/ / menampilkan data info setiap buku
foreach($infobuku as $elemen) (
echo $elemen->get_content();
}
}
Setiap elemen dari $buku dengan method child_nodes() dimasukkan ke dalam $infobuku sebagai array objek juga. Kemudian kita gunakan struktur kendali foreach untuk memroses setiap elemen array $infobuku, dengan menggunakan method get_content() kita menampilkan isi dari semua elemen $infobuku.
Berikut ini script lengkap untuk menampilkan data dari katalog_1.xml dengan menggunakan extensi PHP DOMXML:
Nama file script: xml_domxml.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional// EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>