Suatu hari saya mulai mengerjakan ulang sistem pelaporan internal perusahaan saya, tentang struktur umum yang saya tulis belum lama ini. Tanpa membengkokkan hati saya, saya akan mengatakan bahwa saya tumbuh di atas diri saya dalam hal PHP, dan, sebagai hasilnya, saya menyadari bahwa algoritma sistem cukup bengkok bagi saya untuk menulis ulang. Sebelum ini, dokumen XML diurai menggunakan fungsi yang dipinjam dari PHP 4. Namun, PHP5 memberi dunia hal yang sangat berguna yang disebut SimpleXML. Cara bekerja dengannya akan dibahas hari ini. Sebaiknya dimulai dengan fakta bahwa SimpleXML adalah plug-in terpisah, dan oleh karena itu harus terhubung terlebih dahulu di server yang digunakan. Sekarang kita bisa bekerja! Untuk memproses dokumen, kami menggunakan fungsi simplexml_load_file(). Sebagai parameter, alamat file diteruskan dalam format Bahasa Markup yang Diperluas (XML - K.O. Anda). Kelebihan dari fungsi ini adalah Anda dapat dengan mudah mentransfer file dari server mana pun. Dengan demikian, kami memiliki kemampuan untuk memproses unggahan xml eksternal (misalnya, Yandex-XML atau umpan RSS pihak ketiga). Fungsi mengeluarkan array di pintu keluar. Perangkap yang saya temui adalah bahwa XML dapat memiliki struktur yang canggung, dan oleh karena itu saya menyarankan Anda untuk memulai dengan jejak figuratif dan menampilkan larik untuk memahami bagaimana fungsi menanganinya. Setelah itu, Anda dapat mulai memproses data yang diterima. Sebagai contoh, saya akan mengambil konstruksi sederhana dari sini: Biarkan itu menjadi file export.xml, yang terletak
tepat di root server saya, bersama dengan skrip yang memprosesnya. Seperti halnya array apa pun, data kami dapat diproses menggunakan loop foreach. Kodenya akan seperti ini: $xml = simplexml_load_file("ekspor.xml"); // upload file foreach ($ xml -> film -> film -> karakter sebagai $ crc) // dan sekarang mari kita bekerja dalam dinamika Kode ini akan menempatkan teks "PHP: Parser Appearance" pada variabel $ttl, lalu menampilkan nama-nama hero baris demi baris 28.3K Saya telah melihat banyak parser xml, tetapi saya belum menyentuh pemrograman web. Sekarang saya ingin mencari tahu dan belajar dengan Anda cara membuat parser xml sederhana di php. Untuk apa? Diperlukan! Tidak, sebenarnya: file xml adalah hal yang sangat berguna. Dan profesional mana pun harus ... tidak, dia tidak boleh, tetapi harus tahu bagaimana bekerja dengan mereka. Apakah kita ingin menjadi profesional? Jika Anda berada di blog saya, maka Anda memiliki keinginan seperti itu. Kami akan berasumsi bahwa kami tahu apa itu XML dan tidak akan menjelaskannya di sini. Nah, jika kita tidak tahu, maka kita dapat dengan mudah mencari tahu di sini: http://ru.wikipedia.org/wiki/XML Saat mencari cara untuk mengurai XML di PHP, saya menemukan satu set fungsi sederhana di PHP untuk bekerja dengan file XML yang disebut "Fungsi Parser XML". Parsing dimulai dengan menginisialisasi parser dengan memanggil fungsi xml_parser_create: $xml_parser = xml_parser_create(); Kemudian kita perlu memberi tahu parser fungsi mana yang akan memproses tag xml yang ditemuinya dan informasi teks dalam proses penguraian. Itu. anda perlu menginstal beberapa penangan: xml_set_element_handler ($ xml_parser, “startElement”, “endElement”); Fungsi ini bertanggung jawab untuk mengatur awal elemen dan akhir penangan elemen. Misalnya, jika kombinasi ditemukan dalam teks file xml, maka fungsi startElement akan dipicu saat parser menemukan elemen, dan fungsi endElement saat ditemukan. Fungsi startElement dan endElement sendiri mengambil beberapa parameter sesuai dengan dokumentasi php: Tapi bagaimana Anda membaca data dari file? Kami belum melihat parameter tunggal untuk ini di salah satu fungsi! Dan lebih banyak lagi nanti: membaca file adalah tanggung jawab programmer, mis. kita harus menggunakan fungsi standar untuk bekerja dengan file: Dibuka filenya. Dan sekarang Anda perlu membacanya baris demi baris dan memasukkan baris baca ke fungsi xml_parse: Kesalahan XML: ".xml_error_string (xml_get_error_code ($ xml_parser)); echo" pada baris ".xml_get_current_line_number ($ xml_parser); break;))?> Ada dua hal yang sangat penting untuk diperhatikan di sini. Yang pertama adalah bahwa fungsi xml_parse pada parameter ketiga harus melewati tanda membaca baris terakhir (benar - jika baris terakhir, salah - jika tidak). Yang kedua adalah, seperti dalam bisnis apa pun, kita harus berhati-hati terhadap kesalahan di sini. Fungsi xml_get_error_code dan xml_error_string bertanggung jawab untuk ini. Fungsi pertama menerima kode kesalahan, dan yang kedua, berdasarkan kode yang diterima, mengembalikan deskripsi tekstual dari kesalahan. Apa yang akan terjadi sebagai akibat dari kesalahan - kami akan pertimbangkan nanti. Tidak kurang fungsi yang berguna xml_get_current_line_number akan memberi tahu kami nomor baris yang sedang diproses dalam file. Dan seperti biasa, kita harus melepaskan sumber daya yang ditempati oleh sistem. Untuk mem-parsing XML, ini adalah fungsi xml_parser_free: xml_parser_free ($ xml_parser); Di sini, kami telah membahas fungsi utama. Saatnya melihat mereka berlatih. Untuk ini saya membuat file xml dengan struktur yang sangat sederhana:
Mari kita panggil file ini data.xml dan coba parsing menggunakan kode berikut: Elemen: $nama Sebagai hasil dari skrip paling sederhana yang kami kembangkan, browser menampilkan informasi berikut di jendelanya: Elemen: ROOT Atribut: KVARTIRA = 12 Mari kita coba merusak file XML dengan mengganti tag Pada dan membiarkan tag penutup tetap sama: Elemen: ROOT Kesalahan XML: Tag tidak cocok pada baris 5 Wow! Pesan kesalahan berfungsi! Selain itu, mereka cukup informatif. Eh, saya lupa satu hal lagi... Kami tidak menampilkan teks yang terdapat di dalam alamat dan tag telepon. Kami memperbaiki kekurangan kami - kami menambahkan penangan teks menggunakan fungsi xml_set_character_data_handler: xml_set_character_data_handler ($ xml_parser, 'stringElement'); Dan tambahkan fungsi handler itu sendiri ke kode. Pengurai xml adalah program yang mengekstrak dari sumber data format xml data dan simpan atau gunakan untuk tindakan selanjutnya. Mengapa parser xml diperlukan? Terutama karena format xml itu sendiri populer di kalangan standar komputer. File XML terlihat seperti ini: itu. sebenarnya ada tag, ada beberapa aturan yang tag harus saling mengikuti. Alasan popularitas file xml adalah karena sangat mudah dibaca manusia. Dan fakta bahwa itu relatif mudah ditangani dalam program. Kekurangan file xml. Kelemahannya adalah, pertama-tama, sejumlah besar ruang disk yang digunakan data ini. Karena fakta bahwa tag, yang terus-menerus diulang, dengan data dalam jumlah besar, saya mengambil jumlah megabita yang relatif besar, yang hanya perlu diunduh dari sumbernya, dan kemudian diproses. Apakah ada alternatif? Ada, tentu saja, tetapi semua sama, parser xml dan xml saat ini adalah salah satu format paling sederhana dan paling dapat diandalkan dan populer secara teknologi. Bagaimana parser XML ditulis? Parser ditulis dalam bahasa pemrograman. Seperti yang mereka katakan, mereka ditulis dalam semua, tetapi tidak lebih. Perlu dipahami bahwa ada bahasa pemrograman yang sudah memiliki pustaka bawaan untuk mem-parsing file xml. Tetapi bagaimanapun juga, bahkan jika tidak ada perpustakaan, Anda selalu dapat menemukan perpustakaan yang cocok untuk kasus ini dan menggunakannya untuk mengekstrak data dari file. Secara global, ada 2 pendekatan berbeda tentang cara mengurai file xml. Yang pertama adalah memuat file xml sepenuhnya ke dalam memori dan kemudian melakukan manipulasi ekstraksi data. Yang kedua adalah opsi streaming. Dalam hal ini, bahasa pemrograman mendefinisikan tag tertentu yang perlu ditanggapi oleh fungsi parser xml yang dihasilkan, dan programmer sendiri yang memutuskan apa yang perlu dilakukan jika tag tertentu ditemukan. Keuntungan dari pendekatan pertama adalah kecepatan. Segera saya memuat semuanya ke dalam file, lalu dengan cepat menelusuri memori saya dan menemukan apa yang dibutuhkan dan yang paling penting, pemrograman itu mudah. tapi ada Minus dan sangat penting - itu adalah memori yang besar diperlukan untuk mengoperasikannya. Kadang-kadang, saya bahkan akan mengatakan sering terjadi bahwa tidak mungkin untuk memproses dan mengurai file xml, mis. buat parser xml agar berfungsi dengan benar dengan cara pertama. Mengapa demikian? Yah, misalnya, batasan untuk aplikasi 32-bit di bawah Windows memungkinkan program untuk menempati memori maksimum 2 gigabyte - tidak lebih. Namun, sulit untuk memprogram menggunakan opsi streaming. Kompleksitas dengan ekstraksi yang cukup serius tumbuh secara signifikan, yang karenanya mempengaruhi waktu dan anggaran. Validitas file xml dan parser. Semuanya akan baik-baik saja dengan file xml dan parser xml, tetapi ada masalah. Karena fakta bahwa "setiap siswa" dapat membuat file xml, tetapi pada kenyataannya itu (karena banyak kode ditulis oleh anak sekolah, file yang tidak valid muncul, yaitu yang salah. Apa artinya ini dan apa risikonya ? , ini adalah bahwa kadang-kadang tidak mungkin untuk mengurai file yang tidak valid dengan benar. Misalnya, tagnya tidak ditutup seperti yang diharapkan oleh standar, atau misalnya pengkodean tidak diatur dengan benar. Masalah lain adalah jika, misalnya , Anda melakukan parser di .net, lalu Anda dapat membuat apa yang disebut pembungkus , dan hal yang paling menjengkelkan terjadi ketika Anda membuat pembungkus seperti itu, dan kemudian Anda membacanya sebuah file yang dibuat oleh "siswa", tetapi file tersebut tidak valid dan tidak mungkin untuk membacanya. = karena banyak orang membuat file xml tanpa menggunakan perpustakaan standar dan dengan keengganan total untuk semua standar file xml. Sulit untuk menjelaskan kepada pelanggan. Mereka sedang menunggu hasilnya - pengurai xml yang mengubah data dari file asli ke format lain. Cara membuat parser xml (opsi pertama) Ada bahasa untuk menanyakan data XML seperti Xpath. Bahasa ini memiliki dua edisi, kami tidak akan membahas secara spesifik setiap versi. Pemahaman yang lebih baik tentang bahasa ini akan menunjukkan contoh bagaimana menggunakannya untuk mengambil data. Sebagai contoh. // div [@ class = "guru pendukung"] / a apa yang dilakukan permintaan ini. Dibutuhkan semua tag yang memiliki rentang yang berisi teks catalog.xml?Hid = dan tag ini harus div anak dengan kelas yang sama dengan supcat guru. Ya, untuk pertama kalinya mungkin tidak cukup jelas, tetapi, bagaimanapun, Anda dapat mengetahuinya jika Anda mau. Titik awal bagi saya adalah http://en.wikipedia.org/wiki/XPath dan saya menyarankan Anda. publikasi artikel ini hanya diperbolehkan dengan tautan ke situs web penulis artikel Pada artikel ini, saya akan menunjukkan contoh cara mengurai file XML besar. Jika server Anda (hosting) tidak melarang peningkatan waktu berjalan skrip, maka Anda dapat mengurai file XML dengan berat setidaknya gigabyte, ia secara pribadi hanya mem-parsing file dari ozon seberat 450 megabyte. Ada dua
masalah saat mengurai file XML besar: Masalah kedua dengan waktu dapat diselesaikan jika server tidak melarangnya. PHP memiliki beberapa opsi pemrosesan XML bawaan - SimpleXML,
DOM, SAX. Berikut adalah salah satu contoh, kami mendapatkan objek dari berkas XML Sekarang Anda dapat memproses objek ini, TAPI ... Untuk diproses file besar opsi ini tidak cocok, Anda perlu membaca file baris demi baris dan memproses data ini secara bergantian. Berikut adalah contoh teoritis dari parsing file XML besar. Fungsi webi_xml ($ file) ######## { { ($xml_parser, "data"); // buka filenya $ perviy_vxod = 1; $data = ""; { $ simvol = fgetc ($fp); $ data. = $ simvol; $data = ""; Webi_xml("1.xml"); ?> Dalam contoh ini, saya meletakkan semuanya dalam satu fungsi webi_xml () dan di bagian paling bawah Anda dapat
melihat panggilannya. Misalkan isi file 1.xml adalah beberapa resep
Kita mulai semua dengan memanggil fungsi umum webi_xml ("1.xml"); $xml_parser = xml_parser_create(); Sekarang kami menunjukkan fungsi mana yang akan berfungsi untuk menangkap pembukaan tag, menutup, dan memproses data xml_set_element_handler
($xml_parser, "startElement", "endElement"); Berikutnya adalah pembukaan file yang ditentukan, ulangi file satu karakter pada satu waktu dan tambahkan setiap karakter ke variabel string hingga karakter ditemukan > . Harap dicatat bahwa variabel string selalu dibentuk oleh tag selesai > dan tidak perlu mengirim tag terbuka dan tertutup dengan data ke laba-laba misalnya Jadi, sebagian, sesuai keinginan, Anda dapat mengirim file besar ke dalam pawang. Sekarang mari kita lihat bagaimana data ini diproses dan bagaimana mendapatkannya. Mari kita mulai dengan fungsi tag pembuka startElement ($ parser, $ nama, $ attrs) Setelah itu, pengolahan data tag terbuka dengan fungsi data ($ pengurai, $ data) Dan pemrosesan string kami diselesaikan oleh fungsi endElement ($ parser, $ nama) Dan setelah itu, semuanya berjalan dalam lingkaran lagi. Contoh di atas hanya menunjukkan prinsip pemrosesan XML, tetapi untuk penggunaan nyata perlu ditingkatkan. Fungsi webi_xml ($ file) ####################################################
#################################################### // jika level bersarang tidak lagi nol, maka satu tag sudah terbuka " ; cetak " " ; // setelah memproses data, hapus untuk mengosongkan memori // sekarang pembukaan tag berikutnya telah dimulai dan pemrosesan lebih lanjut akan dilakukan pada langkah berikutnya $ webi_tag_open [$ webi_depth] = $ nama; // tambahkan tag terbuka ke array informasi } ################################################# // di sinilah pemrosesan data dimulai, misalnya, menambahkan ke database, menyimpan ke file, dll. Cetak "data". $ webi_tag_open [$ webi_depth]. "-". ($ webi_data_temp [$ webi_depth] [$ webi_tag_open [$
webi_depth]] ["data"]). " " ; Tidak disetel ($ GLOBALS ["webi_data_temp"]); // setelah memproses data, hapus seluruh array dengan data, karena tag ditutup $
kedalaman_webi -; // kurangi bersarang $xml_parser = xml_parser_create(); // tentukan fungsi mana yang akan berfungsi saat membuka dan menutup tag // tentukan fungsi untuk bekerja dengan data // buka filenya $ perviy_vxod = 1; // tandai untuk memeriksa entri file pertama // loop sampai akhir file ditemukan // jika karakter bukan tag akhir, maka kita kembali ke awal loop dan menambahkan karakter lain ke data, dan seterusnya hingga tag akhir ditemukan // periksa apakah ini entri pertama ke dalam file, lalu hapus semua yang ada sebelum tag// karena terkadang sampah dapat ditemukan sebelum awal XML (editor kikuk, atau file diterima
oleh skrip dari server lain) // sekarang kita membuang data ke dalam parser xml // di sini Anda dapat memproses dan mendapatkan kesalahan untuk validitas ... // setelah parsing, buang data yang dikumpulkan untuk langkah siklus berikutnya. Webi_xml("1.xml"); ?> Seluruh contoh disertai dengan komentar, sekarang uji dan eksperimen. Nah, itu saja, sekarang ada cukup memori saat memproses file dengan ukuran apa pun, tetapi waktu menjalankan skrip dapat ditingkatkan dengan beberapa cara. Atau tambahkan teks ke file .htaccess Anda Contoh-contoh ini akan meningkatkan waktu berjalan skrip menjadi 6000 detik. Jika Anda memiliki akses untuk mengedit php.ini, Anda dapat menambah waktu dengan Misalnya, pada masterhost hosting pada saat penulisan ini, penambahan waktu skrip dilarang, meskipun dinonaktifkan mode aman, tetapi jika Anda seorang profesional, Anda dapat membuat rakitan php sendiri di masterhost, tetapi ini bukan tentang itu di artikel ini. Di artikel terakhir kami bersama Anda, dan saya berjanji bahwa di artikel berikutnya kami akan menguraikannya. Dan hari ini saya akan menunjukkan kepada Anda bagaimana Anda bisa parsing dokumen XML dalam PHP. Saya mengusulkan untuk mengurai dokumen yang kami buat di artikel terakhir, dan cukup menampilkan data dari sana ke browser. Berikut adalah kode skripnya: $dom = new domDocument("1.0", "utf-8"); // Buat dokumen XML versi 1.0 dengan pengkodean utf-8 Dari kode ini, Anda tidak hanya harus mengerti cara mengurai dokumen XML di PHP tapi juga diriku sendiri proses parsing tergantung pada struktur dokumen... Artinya, Anda harus tahu apa strukturnya, jika tidak maka akan bermasalah untuk mengurai dokumen semacam itu. Saya sudah pernah menulis bahwa yang utama fitur XML adalah keketatan sintaks... Saya harap Anda sekarang mengerti mengapa ini sangat penting. Tanpa ini " kekakuan kode"akan sangat sulit untuk mengurai dokumen, dan hal ini sangat sering diperlukan. Ini dasar ketika mengimpor beberapa data dari berkas XML dengan penempatan berikutnya mereka dalam database. |