Mengurai File XML Menggunakan SAX Parser

1. Ikhtisar

SAX, juga dikenal sebagai Simple API untuk XML , digunakan untuk mengurai dokumen XML.

Dalam tutorial ini, kita akan mempelajari apa itu SAX dan mengapa, kapan dan bagaimana itu harus digunakan.

2. SAX : API Sederhana untuk XML

SAX adalah API yang digunakan untuk mengurai dokumen XML. Ini didasarkan pada peristiwa yang dihasilkan saat membaca dokumen. Metode callback menerima peristiwa tersebut. Penangan kustom berisi metode callback tersebut.

API ini efisien karena menghentikan peristiwa tepat setelah callback menerimanya. Oleh karena itu, SAX memiliki manajemen memori yang efisien , tidak seperti DOM, misalnya.

3. SAX vs DOM

DOM adalah singkatan dari Document Object Model. The DOM parser tidak bergantung pada peristiwa . Selain itu, ia memuat seluruh dokumen XML ke dalam memori untuk menguraikannya. SAX lebih hemat memori daripada DOM.

DOM juga memiliki manfaatnya. Misalnya, DOM mendukung XPath. Ini membuatnya juga mudah untuk mengoperasikan seluruh pohon dokumen sekaligus karena dokumen dimuat ke dalam memori .

4. SAX vs StAX

StAX lebih baru dari SAX dan DOM. Itu singkatan dari Streaming API untuk XML .

Perbedaan utama dengan SAX adalah bahwa StAX menggunakan mekanisme tarik, bukan mekanisme dorong SAX (menggunakan panggilan balik).

Ini berarti kontrol diberikan kepada klien untuk memutuskan kapan peristiwa perlu ditarik. Oleh karena itu, tidak ada kewajiban untuk menarik seluruh dokumen jika hanya dibutuhkan sebagian.

Ini menyediakan API yang mudah untuk bekerja dengan XML dengan cara penguraian yang hemat memori.

Tidak seperti SAX, SAX tidak menyediakan validasi skema sebagai salah satu fiturnya.

5. Parsing File XML Menggunakan Custom Handler

Mari sekarang gunakan XML berikut yang mewakili situs web Baeldung dan artikelnya:

   Parsing an XML File Using SAX Parser SAX Parser's Lorem ipsum...   Parsing an XML File Using DOM Parser DOM Parser's Lorem ipsum...   Parsing an XML File Using StAX Parser StAX's Lorem ipsum...   

Kami akan mulai dengan membuat POJO untuk elemen akar Baeldung kami dan anak-anaknya:

public class Baeldung { private List articleList; // usual getters and setters } 
public class BaeldungArticle { private String title; private String content; // usual getters and setters } 

Kami akan melanjutkan dengan membuat BaeldungHandler . Kelas ini akan mengimplementasikan metode callback yang diperlukan untuk merekam peristiwa.

Kami akan mengganti empat metode dari superclass DefaultHandler, masing-masing mengkarakterisasi sebuah acara:

    • karakter (char [], int, int) menerima karakter dengan batas. Kami akan mengubahnya menjadi String dan menyimpannya dalam variabel BaeldungHandler
    • startDocument () dipanggil saat penguraian dimulai - kami akan menggunakannya untuk membuat instance Baeldung kami
    • startElement () dipanggil saat penguraian dimulai untuk elemen - kita akan menggunakannya untuk membuat instance List atau BaeldungArticle - qName membantu kita membedakan kedua jenis
    • endElement () dipanggil saat penguraian berakhir untuk elemen - ini adalah saat kita akan menetapkan konten tag ke variabel masing-masing

Dengan semua callback didefinisikan, sekarang kita dapat menulis kelas BaeldungHandler :

public class BaeldungHandler extends DefaultHandler { private static final String ARTICLES = "articles"; private static final String ARTICLE = "article"; private static final String TITLE = "title"; private static final String CONTENT = "content"; private Baeldung website; private String elementValue; @Override public void characters(char[] ch, int start, int length) throws SAXException { elementValue = new String(ch, start, length); } @Override public void startDocument() throws SAXException { website = new Baeldung(); } @Override public void startElement(String uri, String lName, String qName, Attributes attr) throws SAXException { switch (qName) { case ARTICLES: website.articleList = new ArrayList(); break; case ARTICLE: website.articleList.add(new BaeldungArticle()); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { switch (qName) { case TITLE: latestArticle().title = elementValue; break; case CONTENT: latestArticle().content = elementValue; break; } } private BaeldungArticle latestArticle() { List articleList = website.articleList; int latestArticleIndex = articleList.size() - 1; return articleList.get(latestArticleIndex); } public Baeldung getWebsite() { return website; } } 

Konstanta string juga telah ditambahkan untuk meningkatkan keterbacaan. Metode untuk mengambil artikel terbaru yang ditemui juga nyaman. Terakhir, kita membutuhkan getter untuk obyek Baeldung .

Perhatikan bahwa hal di atas tidak aman untuk thread karena kita memegang status di antara panggilan metode.

6. Menguji Parser

Untuk menguji parser, kami akan membuat contoh SaxFactory , SaxParser dan juga BaeldungHandler :

SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); SaxParserMain.BaeldungHandler baeldungHandler = new SaxParserMain.BaeldungHandler(); 

Setelah itu, kami akan mengurai file XML dan menegaskan bahwa objek berisi semua elemen yang diharapkan yang diurai:

saxParser.parse("src/test/resources/sax/baeldung.xml", baeldungHandler); SaxParserMain.Baeldung result = baeldungHandler.getWebsite(); assertNotNull(result); List articles = result.getArticleList(); assertNotNull(articles); assertEquals(3, articles.size()); SaxParserMain.BaeldungArticle articleOne = articles.get(0); assertEquals("Parsing an XML File Using SAX Parser", articleOne.getTitle()); assertEquals("SAX Parser's Lorem ipsum...", articleOne.getContent()); SaxParserMain.BaeldungArticle articleTwo = articles.get(1); assertEquals("Parsing an XML File Using DOM Parser", articleTwo.getTitle()); assertEquals("DOM Parser's Lorem ipsum...", articleTwo.getContent()); SaxParserMain.BaeldungArticle articleThree = articles.get(2); assertEquals("Parsing an XML File Using StAX Parser", articleThree.getTitle()); assertEquals("StAX Parser's Lorem ipsum...", articleThree.getContent()); 

Seperti yang diharapkan, baeldung telah diurai dengan benar dan berisi sub-objek yang ditunggu.

7. Kesimpulan

Kami baru saja menemukan cara menggunakan SAX untuk mengurai file XML. Ini adalah API yang kuat yang menghasilkan jejak memori ringan di aplikasi kami.

Seperti biasa, kode untuk artikel ini tersedia di GitHub.