Di Java, ada dua cara untuk mengurai dokumen XML secara native, yaitu: penguraian Dom dan penguraian Sax.
Fungsi penguraian dom sangat kuat dan dapat ditambah, dihapus, diubah dan diperiksa. Selama pengoperasian, dokumen xml akan dibaca ke dalam memori dalam bentuk objek dokumen, sehingga cocok untuk dokumen berukuran kecil.
Penguraian Sax membaca konten baris demi baris dan elemen demi elemen dari awal hingga akhir. Lebih merepotkan untuk memodifikasinya, tetapi cocok untuk dokumen read-only berukuran besar.
Artikel ini terutama menjelaskan penguraian Sax, dan sisanya akan ditempatkan nanti.
Sax menggunakan pendekatan berbasis peristiwa untuk mengurai dokumen. Sederhananya, seperti menonton film di bioskop, Anda bisa menontonnya dari awal sampai akhir tanpa harus mundur (Dom bisa membacanya bolak-balik).
Dalam proses menonton film, setiap kali Anda menemukan plot, air mata, atau pertemuan bahu-membahu, Anda akan mengerahkan otak dan saraf Anda untuk menerima atau memproses informasi tersebut.
Demikian pula, selama proses penguraian Sax, membaca awal dan akhir dokumen, serta awal dan akhir elemen akan memicu beberapa metode panggilan balik. Anda dapat melakukan pemrosesan peristiwa terkait dalam metode panggilan balik ini.
Keempat metode tersebut adalah: startDocument(), endDocument(), startElement(), endElement
Selain itu, membaca node saja tidak cukup. Kita juga memerlukan metode character() untuk memproses konten yang terdapat dalam elemen dengan hati-hati.
Dengan mengumpulkan metode callback ini, sebuah kelas terbentuk, yang merupakan trigger yang kita perlukan.
Umumnya, dokumen dibaca dari metode Utama, tetapi dokumen diproses di pemicu. Inilah yang disebut metode parsing berbasis peristiwa.
Seperti yang ditunjukkan di atas, di trigger, ia mulai membaca dokumen terlebih dahulu, lalu mulai mengurai elemen satu per satu. Konten setiap elemen akan dikembalikan ke metode character().
Kemudian akhiri pembacaan elemen. Setelah semua elemen dibaca, akhiri penguraian dokumen.
Sekarang kita mulai membuat kelas trigger. Untuk membuat kelas ini, pertama-tama kita perlu mewarisi DefaultHandler
Buat SaxHandler dan ganti metode yang sesuai:
kelas publik SaxHandler memperluas DefaultHandler {
/* Metode ini memiliki tiga parameter
arg0 adalah array karakter yang dikembalikan, yang berisi konten elemen
arg1 dan arg2 masing-masing adalah posisi awal dan akhir array*/
@Mengesampingkan
karakter kekosongan publik (char[] arg0, int arg1, int arg2) melempar SAXException {
Isi string = String baru(arg0, arg1, arg2);
System.out.println(konten);
super.karakter(arg0, arg1, arg2);
}
@Mengesampingkan
public void endDocument() melempar SAXException {
System.out.println("/n...Akhiri penguraian dokumen...");
super.endDocument();
}
/* arg0 adalah namespacenya
arg1 adalah label yang berisi namespace, atau kosong jika tidak ada namespace
arg2 adalah label tanpa namespace*/
@Mengesampingkan
public void endElement(String arg0, String arg1, String arg2)
melempar SAXException {
System.out.println("Akhiri elemen penguraian" + arg2);
super.endElement(arg0, arg1, arg2);
}
@Mengesampingkan
public void startDocument() melempar SAXException {
System.out.println("............Mulai mengurai dokumen………/n");
super.startDocument();
}
/*arg0 adalah ruang nama
arg1 adalah label yang berisi namespace, atau kosong jika tidak ada namespace
arg2 adalah label tanpa namespace
arg3 jelas merupakan kumpulan atribut*/
@Mengesampingkan
public void startElement(String arg0, String arg1, String arg2,
Atribut arg3) melempar SAXException {
System.out.println("Mulai mengurai elemen" + arg2);
jika (arg3 != nol) {
untuk (int i = 0; i < arg3.getLength(); i++) {
// getQName() untuk mendapatkan nama atribut,
Sistem.keluar.cetak(arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
}
}
Sistem.keluar.cetak(arg2 + ":");
super.startElement(arg0, arg1, arg2, arg3);
}
}
impor javax.xml.parsers.SAXParser;
impor javax.xml.parsers.SAXParserFactory;
kelas publik TestDemo {
public static void main(String[] args) melempar Pengecualian {
// 1. Buat instance objek SAXParserFactory
Pabrik SAXParserFactory = SAXParserFactory.newInstance();
// 2. Buat pengurai
Pengurai SAXParser = pabrik.newSAXParser();
// 3. Dapatkan dokumen yang perlu diurai, buat parser, dan terakhir parsing dokumen
File f = File baru("buku.xml");
SaxHandler dh = SaxHandler baru();
parser.parse(f, dh);
}
}
Mulai parsing buku elemen
buku:
Mulai parsing buku elemen
id="001"buku:
Mulai parsing judul elemen
judul:Harry Potter
Akhiri judul elemen penguraian
Mulai parsing penulis elemen
Pengarang: JK Rowling
Akhiri penguraian elemen penulis
Akhiri buku elemen penguraian
Mulai parsing buku elemen
id="002"buku:
Mulai parsing judul elemen
judul:Belajar XML
Akhiri judul elemen penguraian
Mulai parsing penulis elemen
Pengarang:Erik T. Ray
Akhiri penguraian elemen penulis
Akhiri buku elemen penguraian
Akhiri penguraian buku elemen
............Akhiri penguraian dokumen............
Untuk menjalankan proses ini dengan lebih jelas, kita juga dapat menulis ulang SaxHandler untuk mengembalikan dokumen xml asli
Kelas SaxHandler yang diganti:
kelas publik SaxHandler memperluas DefaultHandler {
@Mengesampingkan
karakter kekosongan publik (char[] arg0, int arg1, int arg2) melempar SAXException {
Sistem.keluar.cetak(String baru(arg0, arg1, arg2));
super.karakter(arg0, arg1, arg2);
}
@Mengesampingkan
public void endDocument() melempar SAXException {
System.out.println("/n mengakhiri penguraian");
super.endDocument();
}
@Mengesampingkan
public void endElement(String arg0, String arg1, String arg2)
melempar SAXException {
Sistem.keluar.cetak("</");
Sistem.keluar.cetak(arg2);
Sistem.keluar.cetak(">");
super.endElement(arg0, arg1, arg2);
}
@Mengesampingkan
public void startDocument() melempar SAXException {
System.out.println("Mulai penguraian");
String s = "<?xml versi=/"1.0/" pengkodean=/"UTF-8/"?>";
Sistem.keluar.println;
super.startDocument();
}
@Mengesampingkan
public void startElement(String arg0, String arg1, String arg2,
Atribut arg3) melempar SAXException {
Sistem.keluar.cetak("<");
Sistem.keluar.cetak(arg2);
jika (arg3 != nol) {
untuk (int i = 0; i < arg3.getLength(); i++) {
Sistem.keluar.print(" " + arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
}
}
Sistem.keluar.cetak(">");
super.startElement(arg0, arg1, arg2, arg3);
}
}
Tampilannya jauh lebih baik sekarang, dan memulihkannya menggambarkan proses penguraiannya dengan lebih baik.