Analyse av en XML-fil ved hjelp av SAX Parser

1. Oversikt

SAX, også kjent som Simple API for XML, brukes til å analysere XML-dokumenter.

I denne opplæringen lærer vi hva SAX er og hvorfor, når og hvordan den skal brukes.

2. SAX: Simple API for XML

SAX er et API som brukes til å analysere XML-dokumenter. Den er basert på hendelser generert mens du leser gjennom dokumentet. Tilbakekallingsmetoder mottar disse hendelsene. En tilpasset behandler inneholder disse tilbakekallingsmetodene.

API-et er effektivt fordi det dropper hendelser rett etter at tilbakeringingene mottok dem. Derfor, SAX har effektiv minnestyring, i motsetning til DOM, for eksempel.

3. SAX vs DOM

DOM står for Document Object Model. De DOM-parser er ikke avhengig av hendelser. Videre laster det hele XML-dokumentet i minnet for å analysere det. SAX er mer minneeffektiv enn DOM.

DOM har også fordelene. For eksempel støtter DOM XPath. Det gjør det også enkelt å bruke hele dokumenttreet samtidig dokumentet er lastet inn i minnet.

4. SAX vs StAX

StAX er nyere enn SAX og DOM. Det står for Streaming API for XML.

Hovedforskjellen med SAX er at StAX bruker en trekkmekanisme i stedet for SAXs push-mekanisme (ved hjelp av tilbakeringing).

Dette betyr at kontrollen blir gitt til klienten for å bestemme når hendelsene må trekkes. Derfor er det ingen forpliktelse til å trekke hele dokumentet hvis bare en del av det er nødvendig.

Det gir en enkel API for å jobbe med XML med en minneeffektiv måte å analysere.

I motsetning til SAX, gir den ikke skjemavalidering som en av funksjonene.

5. Analyse av XML-filen ved hjelp av en tilpasset håndterer

La oss nå bruke følgende XML som representerer Baeldung-nettstedet og dets artikler:

   Analyse av en XML-fil ved bruk av SAX Parser SAX Parser's Lorem ipsum ... Parsing av en XML-fil ved hjelp av DOM Parser DOM Parser Lorem ipsum ... Parsing av en XML-fil ved hjelp av StAX Parser StAXs Lorem ipsum ... 

Vi begynner med å lage POJOer for våre Baeldung rotelement og dets barn:

offentlig klasse Baeldung {private List ArticleList; // vanlige getters og setters} 
offentlig klasse BaeldungArticle {private String title; privat strenginnhold; // vanlige getters og setters} 

Vi fortsetter med å lage BaeldungHandler. Denne klassen vil implementere tilbakekallingsmetodene som er nødvendige for å fange hendelsene.

Vi overstyrer fire metoder fra superklassen Standard håndterer, hver karakteriserer en hendelse:

    • tegn (char [], int, int) mottar tegn med grenser. Vi konverterer dem til en String og lagre den i en variabel på BaeldungHandler
    • startDocument () blir påkalt når analyseringen begynner - vi bruker den til å konstruere vår Baeldung forekomst
    • startElement () blir påkalt når analyseringen begynner for et element - vi bruker den til å konstruere enten Liste eller BaeldungArticle forekomster - qnavn hjelper oss med å skille mellom begge typer
    • endElement () påkalles når analyseringen slutter for et element - dette er når vi tilordner innholdet i kodene til deres respektive variabler

Når alle tilbakekoblingene er definert, kan vi nå skrive BaeldungHandler klasse:

offentlig klasse BaeldungHandler utvider DefaultHandler {privat statisk slutt String ARTIKLER = "artikler"; privat statisk slutt String ARTIKEL = "artikkel"; privat statisk slutt String TITLE = "title"; privat statisk slutt String CONTENT = "content"; privat Baeldung nettsted; private String elementValue; @ Overstyr offentlige ugyldige tegn (char [] ch, int start, int lengde) kaster SAXException {elementValue = new String (ch, start, length); } @ Override offentlig ugyldig startDocument () kaster SAXException {nettsted = ny Baeldung (); } @ Override public void startElement (String uri, String lName, String qName, Attribut attr) kaster SAXException {switch (qName) {case ARTICLES: website.articleList = new ArrayList (); gå i stykker; sak ARTIKEL: website.articleList.add (ny BaeldungArticle ()); }} @ Override public void endElement (String uri, String localName, String qName) kaster SAXException {switch (qName) {case TITLE: latestArticle (). Title = elementValue; gå i stykker; case INNHOLD: latestArticle (). content = elementValue; gå i stykker; }} privat BaeldungArticle latestArticle () {List articleList = website.articleList; int latestArticleIndex = articleList.size () - 1; returner ArticleList.get (latestArticleIndex); } offentlig Baeldung getWebsite () {retur nettsted; }} 

Strengkonstanter er også lagt til for å øke lesbarheten. En metode for å hente den siste artikkelen du har opplevd, er også praktisk. Endelig trenger vi en getter for Baeldung gjenstand.

Merk at ovennevnte ikke er trådsikkert siden vi holder fast i tilstanden mellom metodeanropene.

6. Testing av parseren

For å teste parseren vil vi sette i gang SaxFactory, den SaxParser og også BaeldungHandler:

SAXParserFactory fabrikk = SAXParserFactory.newInstance (); SAXParser saxParser = fabrikk.newSAXParser (); SaxParserMain.BaeldungHandler baeldungHandler = ny SaxParserMain.BaeldungHandler (); 

Etter det analyserer vi XML-filen og hevder at objektet inneholder alle analyserte forventede elementer:

saxParser.parse ("src / test / resources / sax / baeldung.xml", baeldungHandler); SaxParserMain.Baeldung resultat = baeldungHandler.getWebsite (); assertNotNull (resultat); Listeartikler = resultat.getArticleList (); assertNotNull (artikler); assertEquals (3, articles.size ()); SaxParserMain.BaeldungArticle articleOne = articles.get (0); assertEquals ("Parsing av en XML-fil ved bruk av SAX Parser", articleOne.getTitle ()); assertEquals ("SAX Parser's Lorem ipsum ...", ArticleOne.getContent ()); SaxParserMain.BaeldungArticle articleTwo = articles.get (1); assertEquals ("Parsing av en XML-fil ved hjelp av DOM Parser", articleTwo.getTitle ()); assertEquals ("DOM Parser's Lorem ipsum ...", articleTwo.getContent ()); SaxParserMain.BaeldungArticle articleThree = articles.get (2); assertEquals ("Parsing av en XML-fil ved hjelp av StAX Parser", articleThree.getTitle ()); assertEquals ("StAX Parser's Lorem ipsum ...", articleThree.getContent ()); 

Som forventet, baeldung har blitt analysert riktig og inneholder de ventede underobjektene.

7. Konklusjon

Vi oppdaget nettopp hvordan vi bruker SAX til å analysere XML-filer. Det er en kraftig API som genererer et lett minnefotavtrykk i applikasjonene våre.

Som vanlig er koden for denne artikkelen tilgjengelig på GitHub.