Analýza súboru XML pomocou analyzátora SAX

1. Prehľad

SAX, tiež známy ako jednoduché API pre XML, sa používa na analýzu dokumentov XML.

V tomto výučbe sa dozvieme, čo je SAX a prečo, kedy a ako by sa mal používať.

2. SAX: Jednoduché API pre XML

SAX je API používané na analýzu dokumentov XML. To je založený na udalostiach generované pri čítaní dokumentu. Tieto udalosti prijímajú metódy spätného volania. Vlastný obslužný program obsahuje tieto metódy spätného volania.

Rozhranie API je efektívne, pretože zrušuje udalosti hneď po prijatí spätných volaní. Preto SAX má efektívnu správu pamäte, na rozdiel napríklad od DOM.

3. SAX vs DOM

DOM je skratka pre Document Object Model. The Analyzátor DOM sa nespolieha na udalosti. Okrem toho načíta celý dokument XML do pamäte, aby ho mohol analyzovať. SAX je pamäťovo efektívnejší ako DOM.

DOM má tiež svoje výhody. Napríklad DOM podporuje XPath. Od tej doby je tiež ľahké pracovať s celým stromom dokumentov naraz dokument je vložený do pamäte.

4. SAX vs StAX

StAX je novší ako SAX a DOM. To stojí za Streaming API pre XML.

Hlavný rozdiel oproti SAX je v tom StAX využíva ťahový mechanizmus namiesto mechanizmu push spoločnosti SAX (pomocou spätných volaní).

To znamená, že klient dostane kontrolu nad rozhodnutím, kedy je potrebné udalosti pretiahnuť. Preto nie je povinnosťou strhnúť celý dokument, ak je potrebná iba jeho časť.

Poskytuje jednoduché API na prácu s XML s pamäťovo efektívnym spôsobom syntaktickej analýzy.

Na rozdiel od SAX neposkytuje overenie schémy ako jednu zo svojich funkcií.

5. Analýza súboru XML pomocou vlastnej obslužnej rutiny

Poďme teraz použiť nasledujúci súbor XML predstavujúci web Baeldung a jeho články:

   Analýza súboru XML pomocou programu SAX Parser Program SAX Parser's Lorem ipsum ... Analýza súboru XML pomocou nástroja DOM Parser Model DOM Parser's Lorem ipsum ... Analýza súboru XML pomocou nástroja StAX Parser Program Lorx ipsum spoločnosti StAX ... 

Začneme tým, že vytvoríme POJO pre naše Baeldung koreňový prvok a jeho deti:

public class Baeldung {private List articleList; // obvyklí zakladatelia a nastavovatelia} 
public class BaeldungArticle {private String title; súkromný obsah reťazca; // obvyklí zakladatelia a nastavovatelia} 

Budeme pokračovať vytvorením BaeldungHandler. Táto trieda bude implementovať metódy spätného volania potrebné na zachytenie udalostí.

Z nadtriedy prepíšeme štyri metódy DefaultHandler, každá charakteristická udalosť:

    • znaky (char [], int, int) prijíma znaky s hranicami. Premeníme ich na a String a uložte ho do premennej BaeldungHandler
    • startDocument () sa vyvolá, keď začne analýza - použijeme ju na vytvorenie našej Baeldung inštancia
    • startElement () je vyvolané, keď sa začína analýza prvku - použijeme ho na zostrojenie buď Zoznam alebo BaeldungArticle prípady - qName pomáha nám rozlišovať medzi oboma typmi
    • endElement () sa vyvolá, keď sa analýza prvku ukončí - vtedy priradíme obsah značiek k ich príslušným premenným

Keď sú definované všetky spätné volania, môžeme teraz napísať znak BaeldungHandler trieda:

public class BaeldungHandler extends DefaultHandler {private static final String ARTICLES = "articles"; private static final String ČLÁNOK = "článok"; private static final String TITLE = "title"; súkromný statický konečný reťazec CONTENT = "obsah"; súkromná webová stránka Baeldung; 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 () vyvolá SAXException {web = nový Baeldung (); } @Override public void startElement (String uri, String lName, String qName, Attributes attr) hodí SAXException {switch (qName) {case ČLÁNKY: website.articleList = new ArrayList (); prestávka; prípad ČLÁNOK: website.articleList.add (nový BaeldungArticle ()); }} @Override public void endElement (String uri, String localName, String qName) throws SAXException {switch (qName) {case TITLE: latestArticle (). Title = elementValue; prestávka; prípad OBSAH: latestArticle (). content = elementValue; prestávka; }} private BaeldungArticle latestArticle () {List articleList = website.articleList; int latestArticleIndex = articleList.size () - 1; vrátiť articleList.get (latestArticleIndex); } public Baeldung getWebsite () {návrat na web; }} 

Na zvýšenie čitateľnosti boli tiež pridané reťazcové konštanty. Je tiež pohodlný spôsob načítania najnovšieho článku, ktorý sa stretol. Nakoniec potrebujeme getr pre Baeldung objekt.

Všimnite si, že vyššie uvedené nie je bezpečné pre vlákna, pretože sa držíme stavu medzi volaniami metód.

6. Testovanie syntaktického analyzátora

Za účelom otestovania syntaktického analyzátora vytvoríme inštanciu SaxFactory, SaxParser a tiež BaeldungHandler:

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

Potom analyzujeme súbor XML a tvrdíme, že objekt obsahuje všetky očakávané analyzované prvky:

saxParser.parse ("src / test / resources / sax / baeldung.xml", baeldungHandler); Výsledok SaxParserMain.Baeldung = baeldungHandler.getWebsite (); assertNotNull (výsledok); Zoznam článkov = result.getArticleList (); assertNotNull (články); assertEquals (3, articles.size ()); SaxParserMain.BaeldungArticle articleOne = articles.get (0); assertEquals ("Analýza súboru XML pomocou analyzátora SAX", articleOne.getTitle ()); assertEquals ("SAX Parser's Lorem ipsum ...", articleOne.getContent ()); SaxParserMain.BaeldungArticle articleTwo = articles.get (1); assertEquals ("Analýza súboru XML pomocou analyzátora DOM", articleTwo.getTitle ()); assertEquals ("DOM Parser's Lorem ipsum ...", articleTwo.getContent ()); SaxParserMain.BaeldungArticle articleThree = articles.get (2); assertEquals ("Analýza súboru XML pomocou analyzátora StAX", articleThree.getTitle ()); assertEquals ("Lorax ipsum ...", analyzátor StAX, articleThree.getContent ()); 

Podľa očakávania baeldung bol správne analyzovaný a obsahuje očakávané čiastkové objekty.

7. Záver

Práve sme objavili, ako používať SAX na analýzu súborov XML. Je to výkonné API generujúce v našich aplikáciách ľahkú pamäťovú stopu.

Ako obvykle je kód tohto článku k dispozícii na GitHub.