Menghuraikan Fail XML Menggunakan SAX Parser

1. Gambaran keseluruhan

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

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

2. SAX : API Mudah untuk XML

SAX adalah API yang digunakan untuk menguraikan dokumen XML. Ia berdasarkan peristiwa yang dihasilkan semasa membaca dokumen. Kaedah panggilan balik menerima peristiwa tersebut. Pengendali tersuai mengandungi kaedah panggilan balik tersebut.

API ini berkesan kerana menjatuhkan peristiwa tepat setelah panggilan balik menerimanya. Oleh itu, SAX mempunyai pengurusan memori yang cekap , tidak seperti DOM, misalnya.

3. SAX vs DOM

DOM bermaksud Model Objek Dokumen. The DOM penghurai tidak bergantung pada aktiviti . Lebih-lebih lagi, ia memuatkan keseluruhan dokumen XML ke dalam memori untuk menguraikannya. SAX lebih cekap memori daripada DOM.

DOM juga mempunyai faedahnya. Contohnya, DOM menyokong XPath. Ia juga memudahkan pengoperasian pada keseluruhan pohon dokumen sekaligus kerana dokumen tersebut dimasukkan ke dalam memori .

4. SAX vs StAX

StAX lebih baru daripada SAX dan DOM. Ia bermaksud Streaming API untuk XML .

Perbezaan utama dengan SAX adalah bahawa StAX menggunakan mekanisme tarikan dan bukannya mekanisme tolak SAX (menggunakan panggilan balik).

Ini bermaksud kawalan diberikan kepada klien untuk memutuskan kapan peristiwa perlu ditarik. Oleh itu, tidak ada kewajiban untuk menarik keseluruhan dokumen jika hanya sebahagian daripadanya diperlukan.

Ia menyediakan API yang mudah untuk digunakan dengan XML dengan kaedah penghuraian memori yang cekap.

Tidak seperti SAX, ia tidak memberikan pengesahan skema sebagai salah satu ciri.

5. Menghuraikan Fail XML Menggunakan Custom Handler

Sekarang mari kita gunakan XML berikut yang mewakili laman 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...   

Kita akan mulakan dengan membuat POJO untuk elemen akar Baeldung 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 teruskan dengan membuat BaeldungHandler . Kelas ini akan melaksanakan kaedah panggilan balik yang diperlukan untuk menangkap peristiwa.

Kami akan mengatasi empat kaedah dari superclass DefaultHandler, masing-masing mencirikan acara:

    • watak (char [], int, int) menerima watak dengan sempadan. Kami akan menukarnya menjadi String dan menyimpannya dalam pemboleh ubah BaeldungHandler
    • startDocument () dipanggil ketika penghuraian bermula - kami akan menggunakannya untuk membina contoh Baeldung kami
    • startElement () dipanggil ketika penghuraian bermula untuk elemen - kami akan menggunakannya untuk membina contoh List atau BaeldungArticle - qName membantu kami membuat perbezaan antara kedua-dua jenis
    • endElement () dipanggil ketika penghuraian berakhir untuk elemen - ini adalah ketika kita akan menetapkan kandungan tag ke pemboleh ubah masing-masing

Dengan semua panggilan balik yang ditentukan, kita sekarang 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; } } 

Pemalar tali juga telah ditambah untuk meningkatkan kebolehbacaan. Kaedah untuk mendapatkan artikel terbaru yang ditemui juga sesuai. Akhirnya, kita memerlukan pengambil untuk objek Baeldung .

Ambil perhatian bahawa perkara di atas tidak selamat kerana kita terus berada di antara kaedah panggilan.

6. Menguji Parser

Untuk menguji penghurai, kami akan memberi contoh SaxFactory , SaxParser dan juga BaeldungHandler :

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

Selepas itu, kami akan menguraikan fail XML dan menegaskan bahawa objek tersebut mengandungi semua elemen yang diharapkan dihuraikan:

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 betul dan berisi sub-objek yang ditunggu-tunggu.

7. Kesimpulannya

Kami baru sahaja mengetahui cara menggunakan SAX untuk menguraikan fail XML. Ini adalah API yang kuat menghasilkan jejak memori ringan dalam aplikasi kami.

Seperti biasa, kod untuk artikel ini terdapat di GitHub.