Ada banyak teknik membaca dan menulis XML dengan PHP. Artikel ini menyediakan tiga metode untuk membaca XML: menggunakan pustaka DOM, menggunakan parser SAX, dan menggunakan ekspresi reguler. Menulis XML menggunakan templat teks DOM dan PHP juga dibahas.
Membaca dan menulis Extensible Markup Language (XML) di PHP mungkin terasa sedikit menakutkan. Faktanya, XML dan semua teknologi terkait bisa jadi menakutkan, namun membaca dan menulis XML di PHP tidak harus menjadi tugas yang menakutkan. Pertama, Anda perlu mempelajari sedikit tentang XML—apa itu XML dan apa yang dapat Anda lakukan dengannya. Kemudian, Anda perlu mempelajari cara membaca dan menulis XML di PHP, dan ada banyak cara untuk melakukannya.
Artikel ini memberikan pengenalan singkat tentang XML dan kemudian menjelaskan cara membaca dan menulis XML dengan PHP.
Apa itu XML?
XML adalah format penyimpanan data. Itu tidak menentukan data apa yang disimpan, juga tidak menentukan format data. XML hanya mendefinisikan tag dan atribut dari tag tersebut. Markup XML yang terbentuk dengan baik terlihat seperti ini:
<nama>Jack Herrington</nama>
Tag <nama> ini berisi beberapa teks: Jack Herrington.
Markup XML tanpa teks terlihat seperti ini:
<powerUp/>
Ada lebih dari satu cara untuk menulis sesuatu dalam XML. Misalnya, tag ini menghasilkan keluaran yang sama dengan tag sebelumnya:
<powerUp></powerUp>
Anda juga dapat menambahkan atribut ke tag XML. Misalnya, tag <name> ini berisi atribut pertama dan terakhir:
<nama depan="Jack" terakhir="Herrington" />
Karakter khusus juga dapat dikodekan dalam XML. Misalnya, simbol & dapat dikodekan seperti ini:
&
File XML yang berisi tag dan atribut akan terbentuk dengan baik jika diformat seperti contoh, yang berarti tagnya simetris dan karakternya dikodekan dengan benar. Listing 1 adalah contoh XML yang dibentuk dengan baik.
Listing 1. Contoh daftar buku XML
<buku>
<buku>
<penulis>Jack Herrington</penulis>
<judul>Peretasan PHP</judul>
<penerbit>O'Reilly</penerbit>
</buku>
<buku>
<penulis>Jack Herrington</penulis>
<title>Peretasan Podcasting</title>
<penerbit>O'Reilly</penerbit>
</buku>
</buku>
|
XML di Listing 1 berisi daftar buku. Tag induk <books> berisi sekumpulan tag <book>, yang masing-masing berisi tag <author>, <title>, dan <publisher>.
Dokumen XML benar jika struktur markup dan kontennya diverifikasi oleh file skema eksternal. File skema dapat ditentukan dalam format berbeda. Untuk artikel ini, yang diperlukan hanyalah XML yang berformat baik.
Jika menurut Anda XML sangat mirip dengan Hypertext Markup Language (HTML), Anda benar. XML dan HTML keduanya merupakan bahasa berbasis markup dan memiliki banyak kesamaan. Namun, penting untuk diingat bahwa meskipun dokumen XML mungkin merupakan HTML dengan format yang baik, tidak semua dokumen HTML adalah XML dengan format yang baik. Tag baris baru (br) adalah contoh bagus perbedaan antara XML dan HTML. Tag baris baru ini adalah HTML dengan format yang baik, namun bukan XML dengan format yang baik:
<p>Ini adalah paragraf<br>
Dengan jeda baris</p>
Tag baris baru ini adalah XML dan HTML yang dibentuk dengan baik:
<p>Ini adalah paragraf<br />
Dengan jeda baris</p>
Jika Anda ingin menulis HTML sebagai XML yang baik, ikuti standar Extensible Hypertext Markup Language (XHTML) komite W3C (lihat Sumberdaya ). Semua browser modern dapat merender XHTML. Selain itu, Anda dapat menggunakan alat XML untuk membaca XHTML dan menemukan data dalam dokumen, yang jauh lebih mudah daripada menguraikan HTML.
Baca XML menggunakan perpustakaan DOM
Cara termudah untuk membaca file XML yang dibentuk dengan baik adalah dengan menggunakan pustaka Document Object Model (DOM) yang dikompilasi ke dalam beberapa instalasi PHP. Pustaka DOM membaca seluruh dokumen XML ke dalam memori dan mewakilinya sebagai pohon simpul, seperti yang ditunjukkan pada Gambar 1.
Gambar 1. Pohon XML DOM untuk XML buku
Node buku di bagian atas pohon memiliki dua tag anak buku. Setiap buku memiliki beberapa node: penulis, penerbit, dan judul. Node penulis, penerbit, dan judul masing-masing memiliki node anak teks yang berisi teks.
Kode yang membaca file XML buku dan menampilkan konten menggunakan DOM ditunjukkan pada Listing 2.
Listing 2. Membaca buku XML menggunakan DOM
<?php
$doc = DOMDocument baru();
$doc->load( 'buku.xml' );
$buku = $doc->getElementsByTagName( "buku" );
foreach( $buku sebagai $buku )
{
$penulis = $buku->getElementsByTagName( "penulis" );
$penulis = $penulis->item(0)->nodeValue;
$publishers = $buku->getElementsByTagName( "penerbit" );
$publisher = $publishers->item(0)->nodeValue;
$judul = $buku->getElementsByTagName( "judul" );
$title = $titles->item(0)->nodeValue;
echo "$judul - $penulis - $penerbitn";
}
?>
|
Skrip pertama-tama membuat objek DOMdocument baru dan memuat XML buku ke objek ini menggunakan metode load. Setelah itu, skrip menggunakan metode getElementsByName untuk mendapatkan daftar semua elemen dengan nama yang ditentukan.
Dalam loop node buku, skrip menggunakan metode getElementsByName untuk mendapatkan nodeValue dari penulis, penerbit, dan tag judul. nodeValue adalah teks di dalam node. Skrip kemudian menampilkan nilai-nilai ini.
Anda dapat menjalankan skrip PHP pada baris perintah seperti ini:
%phpe1.php
Peretasan PHP - Jack Herrington - O'Reilly
Peretasan Podcasting - Jack Herrington - O'Reilly
%
Seperti yang Anda lihat, setiap blok buku menghasilkan satu baris. Ini adalah awal yang baik. Namun bagaimana jika Anda tidak memiliki akses ke perpustakaan XML DOM?
Baca XML dengan parser SAX
Cara lain untuk membaca XML adalah dengan menggunakan parser XML Simple API (SAX). Sebagian besar instalasi PHP menyertakan parser SAX. Parser SAX berjalan pada model panggilan balik. Setiap kali tag dibuka atau ditutup, atau setiap kali parser melihat teks, fungsi yang ditentukan pengguna dipanggil kembali dengan informasi tentang node atau teks.
Keuntungan parser SAX adalah bobotnya yang sangat ringan. Parser tidak menyimpan konten dalam memori untuk jangka waktu yang lama, sehingga dapat digunakan untuk file yang sangat besar. Kerugiannya adalah menulis callback parser SAX sangat rumit. Listing 3 menunjukkan kode yang menggunakan SAX untuk membaca file XML buku dan menampilkan isinya.
Listing 3. Membaca buku XML dengan SAX parser
<?php
$g_buku = susunan();
$g_elem = nol;
fungsi startElement( $parser, $nama, $attrs )
{
global $g_buku, $g_elem;
if ( $nama == 'BUKU' ) $g_buku []= array();
$g_elem = $nama;
}
fungsi endElement( $parser, $nama )
{
global $g_elem;
$g_elem = nol;
}
fungsi textData( $parser, $teks )
{
global $g_buku, $g_elem;
if ( $g_elem == 'PENULIS' ||
$g_elem == 'PENERBIT' ||
$g_elem == 'JUDUL' )
{
$g_books[ hitungan( $g_books ) - 1 ][ $g_elem ] = $teks;
}
}
$parser = xml_parser_create();
xml_set_element_handler( $parser, "startElement", "endElement" );
xml_set_character_data_handler( $parser, "datateks" );
$f = fopen( 'buku.xml', 'r' );
while( $data = ketakutan( $f, 4096 ) )
{
xml_parse( $parser, $data );
}
xml_parser_free( $parser );
foreach( $g_books sebagai $book )
{
echo $book['TITLE']." - ".$book['AUTHOR']." - ";
echo $buku['PENERBIT']."n";
}
?>
|
Skrip pertama-tama menyiapkan larik g_books, yang menyimpan semua buku dan informasi buku di memori, dan variabel g_elem menyimpan nama tag yang sedang diproses skrip. Skrip kemudian mendefinisikan fungsi panggilan balik. Dalam contoh ini, fungsi callback adalah startElement, endElement, dan textData. Saat membuka dan menutup tanda, panggil fungsi startElement dan endElement masing-masing. TextData dipanggil pada teks antara tag pembuka dan penutup.
Dalam contoh ini, tag startElement mencari tag buku untuk memulai elemen baru dalam array buku. Fungsi textData kemudian melihat elemen saat ini untuk melihat apakah itu adalah penerbit, judul, atau tag penulis. Jika demikian, fungsinya akan memasukkan teks saat ini ke dalam buku saat ini.
Agar penguraian dapat dilanjutkan, skrip membuat parser menggunakan fungsi xml_parser_create. Kemudian, atur pegangan panggilan balik. Setelah itu, skrip membaca file dan mengirimkan potongan file ke parser. Setelah file dibaca, fungsi xml_parser_free menghapus parser. Akhir skrip menampilkan konten array g_books.
Seperti yang Anda lihat, ini jauh lebih sulit daripada menulis fungsi yang sama di DOM. Bagaimana jika tidak ada perpustakaan DOM dan tidak ada perpustakaan SAX? Apakah ada alternatif lain?
Parsing XML dengan ekspresi reguler
Saya yakin beberapa insinyur akan mengkritik saya karena menyebutkan metode ini, tetapi XML dapat diurai dengan ekspresi reguler. Listing 4 menunjukkan contoh penggunaan fungsi preg_ untuk membaca file buku.
Listing 4. Membaca XML dengan ekspresi reguler
<?php
$xml = "";
$f = fopen( 'buku.xml', 'r' );
while( $data = ketakutan( $f, 4096 ) ) { $xml .= $data }
fclose( $f );
preg_match_all( "/<buku>(.*?)</buku>/s",
$xml, $blok buku );
foreach( $bookblocks[1] sebagai $block )
{
preg_match_all( "/<penulis>(.*?)</penulis>/",
$blok, $penulis );
preg_match_all( "/<judul>(.*?)</judul>/",
$blok, $judul );
preg_match_all( "/<publisher>(.*?)</publisher>/",
$blok, $penerbit );
echo( $judul[1][0]." - ".$penulis[1][0]." - ".
$publisher[1][0]."n" );
}
?>
|
Perhatikan betapa pendeknya kode ini. Awalnya, ia membaca file menjadi string besar. Kemudian gunakan fungsi regex untuk membaca setiap item buku. Terakhir, gunakan perulangan foreach untuk menelusuri setiap blok buku dan mengekstrak penulis, judul, dan penerbit.
Lalu, dimana kekurangannya? Masalah dengan penggunaan kode ekspresi reguler untuk membaca XML adalah kode tersebut tidak memeriksa terlebih dahulu untuk memastikan XML dalam bentuk yang baik. Artinya, tidak ada cara untuk mengetahui apakah XML sudah terbentuk dengan baik sebelum membacanya. Selain itu, beberapa XML yang dibuat dengan baik mungkin tidak cocok dengan ekspresi reguler, sehingga harus dimodifikasi nanti.
Saya tidak pernah menyarankan penggunaan ekspresi reguler untuk membaca XML, tetapi terkadang ini adalah cara terbaik untuk kompatibilitas karena fungsi ekspresi reguler selalu tersedia. Jangan gunakan ekspresi reguler untuk membaca XML langsung dari pengguna karena Anda tidak memiliki kendali atas format atau struktur XML tersebut. Anda harus selalu menggunakan perpustakaan DOM atau parser SAX untuk membaca XML dari pengguna. Menulis XML menggunakan DOM
Membaca XML hanyalah sebagian dari persamaan. Bagaimana cara menulis XML? Cara terbaik untuk menulis XML adalah dengan menggunakan DOM. Listing 5 menunjukkan bagaimana DOM membuat file XML buku.
Listing 5. Menulis buku XML menggunakan DOM
<?php
$buku = array();
$buku [] = susunan(
'title' => 'Peretasan PHP',
'penulis' => 'Jack Herrington',
'penerbit' => "O'Reilly"
);
$buku [] = susunan(
'title' => 'Peretasan Podcasting',
'penulis' => 'Jack Herrington',
'penerbit' => "O'Reilly"
);
$doc = DOMDocument baru();
$doc->formatOutput = benar;
$r = $doc->createElement( "buku" );
$doc->appendChild( $r );
foreach( $buku sebagai $buku )
{
$b = $doc->createElement( "buku" );
$penulis = $doc->createElement( "penulis" );
$penulis->appendChild(
$doc->createTextNode( $buku['penulis'] )
);
$b->appendChild( $penulis );
$judul = $doc->createElement( "judul" );
$judul->appendChild(
$doc->createTextNode( $buku['judul'] )
);
$b->appendChild( $judul );
$publisher = $doc->createElement( "penerbit" );
$publisher->appendChild(
$doc->createTextNode( $buku['penerbit'] )
);
$b->appendChild( $publisher );
$r->appendChild( $b );
}
echo $doc->saveXML();
?>
|
Di bagian atas skrip, array buku dimuat dengan beberapa buku contoh. Data ini bisa berasal dari pengguna atau dari database.
Setelah buku contoh dimuat, skrip membuat DOMDocument baru dan menambahkan simpul buku akar ke dalamnya. Skrip kemudian membuat simpul untuk setiap penulis, judul, dan penerbit buku, dan menambahkan simpul teks ke setiap simpul. Langkah terakhir untuk setiap simpul buku adalah menambahkannya kembali ke simpul buku akar.
Di akhir skrip, gunakan metode saveXML untuk mengeluarkan XML ke konsol. (Anda juga dapat menggunakan metode simpan untuk membuat file XML.) Output skrip ditunjukkan pada Listing 6.
Listing 6. Output dari skrip build DOM
%phpe4.php
<?xml versi="1.0"?>
<buku>
<buku>
<penulis>Jack Herrington</penulis>
<judul>Peretasan PHP</judul>
<penerbit>O'Reilly</penerbit>
</buku>
<buku>
<penulis>Jack Herrington</penulis>
<title>Peretasan Podcasting</title>
<penerbit>O'Reilly</penerbit>
</buku>
</buku>
%
|
Nilai sebenarnya dari penggunaan DOM adalah XML yang dibuatnya selalu dalam bentuk yang baik. Namun bagaimana jika Anda tidak bisa membuat XML menggunakan DOM?
Menulis XML di PHP
Jika DOM tidak tersedia, XML dapat ditulis menggunakan templat teks PHP. Listing 7 menunjukkan bagaimana PHP membuat file XML buku.
Listing 7. Menulis buku XML dalam PHP
<?php
$buku = array();
$buku [] = susunan(
'title' => 'Peretasan PHP',
'penulis' => 'Jack Herrington',
'penerbit' => "O'Reilly"
);
$buku [] = susunan(
'title' => 'Peretasan Podcasting',
'penulis' => 'Jack Herrington',
'penerbit' => "O'Reilly"
);
?>
<buku>
<?php
foreach( $buku sebagai $buku )
{
?>
<buku>
<judul><?php echo( $buku['judul'] ?></judul>
<penulis><?php echo( $buku['penulis'] ?>
</penulis>
<penerbit><?php echo( $buku['penerbit'] ?>
</penerbit>
</buku>
<?php
}
?>
</buku>
|
Bagian atas skrip mirip dengan skrip DOM. Bagian bawah skrip membuka tag buku dan kemudian mengulangi setiap buku, membuat tag buku dan semua tag judul, penulis, dan penerbit internal.
Masalah dengan pendekatan ini adalah pengkodean entitas. Untuk memastikan bahwa entitas dikodekan dengan benar, fungsi htmlentities harus dipanggil pada setiap item, seperti yang ditunjukkan pada Listing 8.
Listing 8. Pengkodean entitas menggunakan fungsi htmlentities
<buku>
<?php
foreach( $buku sebagai $buku )
{
$judul = htmlentitas( $buku['judul'], ENT_QUOTES );
$penulis = htmlentities( $buku['penulis'], ENT_QUOTES );
$publisher = htmlentities( $book['publisher'], ENT_QUOTES );
?>
<buku>
<judul><?php echo( $judul ); ?></judul>
<penulis><?php echo( $penulis ?> </penulis>
<penerbit><?php echo( $penerbit ?>
</penerbit>
</buku>
<?php
}
?>
</buku>
|
Di sinilah menulis XML dalam PHP dasar menjadi menjengkelkan. Anda pikir Anda telah membuat XML yang sempurna, tetapi segera setelah Anda mencoba menggunakan datanya, Anda menemukan bahwa beberapa elemen dikodekan secara tidak benar.
Kesimpulan
Selalu ada banyak hal yang berlebihan dan membingungkan seputar XML. Namun, ini tidak sesulit yang Anda bayangkan - terutama dalam bahasa sehebat PHP. Setelah Anda memahami dan mengimplementasikan XML dengan benar, Anda akan menemukan banyak alat canggih yang dapat Anda gunakan. XPath dan XSLT adalah dua alat yang layak dipelajari.