Parsing af en XML-fil ved hjælp af SAX Parser

1. Oversigt

SAX, også kendt som Simple API til XML, bruges til at analysere XML-dokumenter.

I denne vejledning lærer vi, hvad SAX er, og hvorfor, hvornår og hvordan den skal bruges.

2. SAX: Simple API til XML

SAX er en API, der bruges til at analysere XML-dokumenter. Det er baseret på begivenheder genereret under læsning gennem dokumentet. Tilbagekaldsmetoder modtager disse begivenheder. En brugerdefineret handler indeholder disse tilbagekaldsmetoder.

API'et er effektivt, fordi det taber begivenheder lige efter tilbagekaldene modtog dem. Derfor, SAX har effektiv hukommelsesstyringi modsætning til for eksempel DOM.

3. SAX vs DOM

DOM står for Document Object Model. Det DOM-parser er ikke afhængig af begivenheder. Desuden indlæser det hele XML-dokumentet i hukommelsen for at analysere det. SAX er mere hukommelseseffektiv end DOM.

DOM har også sine fordele. For eksempel understøtter DOM XPath. Det gør det også let at betjene hele dokumenttræet på én gang siden dokumentet indlæses i hukommelsen.

4. SAX vs StAX

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

Den største forskel med SAX er, at StAX bruger en trækmekanisme i stedet for SAX's push-mekanisme (ved hjælp af tilbagekald).

Dette betyder, at klienten får kontrol over, hvornår begivenhederne skal trækkes. Derfor er der ingen forpligtelse til at trække hele dokumentet, hvis kun en del af det er nødvendigt.

Det giver en let API til at arbejde med XML med en hukommelseseffektiv måde til parsing.

I modsætning til SAX giver den ikke skemavalidering som en af ​​dens funktioner.

5. Parsing af XML-filen ved hjælp af en brugerdefineret håndterer

Lad os nu bruge følgende XML, der repræsenterer Baeldung-webstedet og dets artikler:

   Parsing af en XML-fil ved hjælp af SAX Parser SAX Parsers Lorem ipsum ... Parsing af en XML-fil ved hjælp af DOM Parser DOM Parsers Lorem ipsum ... Parsing af en XML-fil ved hjælp af StAX Parser StAXs Lorem ipsum ... 

Vi begynder med at oprette POJO'er til vores Baeldung rodelement og dets børn:

offentlig klasse Baeldung {privat Liste ArticleList; // sædvanlige getters og setters} 
offentlig klasse BaeldungArticle {privat strengetitel; privat strengindhold; // sædvanlige getters og setters} 

Vi fortsætter med at oprette BaeldungHandler. Denne klasse implementerer de tilbagekaldsmetoder, der er nødvendige for at registrere begivenhederne.

Vi tilsidesætter fire metoder fra superklassen Standardhåndterer, hver karakteriserer en begivenhed:

    • tegn (char [], int, int) modtager tegn med grænser. Vi konverterer dem til en Snor og opbevar den i variablen BaeldungHandler
    • startDokument () påberåbes, når parsingen begynder - vi bruger den til at konstruere vores Baeldung eksempel
    • startElement () påberåbes, når parsingen begynder for et element - vi bruger det til at konstruere enten Liste eller BaeldungArticle tilfælde - qnavn hjælper os med at skelne mellem begge typer
    • endElement () påberåbes, når parsingen slutter for et element - det er, når vi tildeler indholdet af tags til deres respektive variabler

Med alle definerede tilbagekald kan vi nu skrive BaeldungHandler klasse:

offentlig klasse BaeldungHandler udvider DefaultHandler {privat statisk endelig String ARTIKLER = "artikler"; privat statisk endelig String ARTIKEL = "artikel"; privat statisk endelig String TITLE = "title"; privat statisk endelig String CONTENT = "indhold"; privat Baeldung-websted; private String elementValue; @Override offentlige ugyldige tegn (char [] ch, int start, int længde) kaster SAXException {elementValue = ny streng (ch, start, længde); } @ Override offentligt ugyldigt startDocument () kaster SAXException {website = ny Baeldung (); } @ Override public void startElement (String uri, String lName, String qName, Attribut attr) kaster SAXException {switch (qName) {case ARTICLES: website.articleList = new ArrayList (); pause; sag 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; pause; sag INDHOLD: latestArticle (). indhold = elementValue; pause; }} privat BaeldungArticle latestArticle () {List articleList = website.articleList; int latestArticleIndex = articleList.size () - 1; returner ArticleList.get (latestArticleIndex); } offentlig Baeldung getWebsite () {returwebsted; }} 

Strengkonstanter er også tilføjet for at øge læsbarheden. En metode til at hente den senest stødte artikel er også praktisk. Endelig har vi brug for en getter til Baeldung objekt.

Bemærk, at ovenstående ikke er trådsikker, da vi holder fast i tilstanden mellem metodekaldene.

6. Test af parseren

For at teste parseren vil vi instantiere SaxFactory, det SaxParser og også BaeldungHandler:

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

Derefter analyserer vi XML-filen og hævder, at objektet indeholder alle parsede forventede elementer:

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

Som forventet baeldung er blevet parset korrekt og indeholder de afventede underobjekter.

7. Konklusion

Vi har lige opdaget, hvordan vi bruger SAX til at analysere XML-filer. Det er en kraftfuld API, der genererer et let hukommelsesaftryk i vores applikationer.

Som sædvanlig er koden til denne artikel tilgængelig på GitHub.