XML fájl elemzése a SAX elemző használatával

1. Áttekintés

SAX, más néven az XML egyszerű API-ja, XML dokumentumok elemzésére szolgál.

Ebben az oktatóanyagban megtudhatjuk, mi az a SAX, és miért, mikor és hogyan kell használni.

2. SAX: az XML egyszerű API-ja

A SAX egy API, amelyet XML dokumentumok elemzésére használnak. Azt eseményeken alapul a dokumentum végigolvasása közben keletkezik. Visszahívási módszerek fogadják ezeket az eseményeket. Egy egyedi kezelő tartalmazza azokat a visszahívási módszereket.

Az API hatékony, mert azonnal eldobja az eseményeket, miután a visszahívások befogadták őket. Ebből kifolyólag, A SAX hatékony memóriakezeléssel rendelkezik, ellentétben például a DOM-mal.

3. SAX vs DOM

A DOM a Document Object Model rövidítést jelenti. A A DOM elemző nem támaszkodik eseményekre. Ezenkívül az egész XML dokumentumot a memóriába tölti, hogy elemezze azt. A SAX memória-hatékonyabb, mint a DOM.

A DOM-nak is megvannak az előnyei. Például a DOM támogatja az XPath-ot. Könnyíti az egész dokumentumfa egyszerre történő kezelését azóta a dokumentum betöltődik a memóriába.

4. SAX vs StAX

A StAX újabb, mint a SAX és a DOM. Azt jelenti Streaming API XML-hez.

A fő különbség a SAX-szal szemben az A StAX húzómechanizmust használ a SAX toló mechanizmusa helyett (visszahívások segítségével).

Ez azt jelenti, hogy a kliens ellenőrzést kap, hogy eldöntse, mikor kell meghúzni az eseményeket. Ezért nem kötelező az egész dokumentumot kihúzni, ha csak annak egy részére van szükség.

Könnyen kezelhető API-t biztosít az XML-mel, memória-hatékony elemzéssel.

A SAX-szel ellentétben a sémaellenőrzést nem adja meg egyik jellemzőjeként.

5. Az XML fájl elemzése egyéni kezelővel

Használjuk most a Baeldung webhelyet és annak cikkeit képviselő XML-t:

   XML fájl elemzése SAX elemző segítségével A SAX elemző Lorem ipsum ... XML fájl elemzése a DOM elemző használatával A DOM elemző Lorem ipsum használata ... XML fájl elemzése a StAX elemző használatával A StAX elemzője A StAX Lorem ipsum ... 

Kezdjük POJO-k létrehozásával Baeldung gyökérelem és gyermekei:

nyilvános osztály Baeldung {private List ArticleList; // szokásos getterek és beállítók} 
public class BaeldungArticle {private String title; privát String tartalom; // szokásos getterek és beállítók} 

Folytatjuk a BaeldungHandler. Ez az osztály végrehajtja az események rögzítéséhez szükséges visszahívási módszereket.

Négy módszert felülírunk a szuperosztályból DefaultHandler, mindegyik eseményt jellemez:

    • karakterek (char [], int, int) határokkal rendelkező karaktereket fogad. Átalakítjuk őket a-ra Húr és tárolja egy változóban BaeldungHandler
    • startDocument () az elemzés megkezdésekor hívják meg - mi felhasználjuk a Baeldung példa
    • startElement () akkor hívódik meg, amikor egy elem elemzése megkezdődik - a felépítésre is felhasználjuk Lista vagy BaeldungArticle példányok - qNév segít megkülönböztetni mindkét típust
    • endElement () akkor hívódik meg, amikor az elemzés véget ér egy elemnél - ekkor hozzárendeljük a címkék tartalmát a megfelelő változókhoz

Az összes definiált visszahívással most megírhatjuk a BaeldungHandler osztály:

a BaeldungHandler nyilvános osztály kiterjeszti a DefaultHandler {private static final String CIKKEK = "cikkek"; privát statikus végleges karakterlánc CIKK = "cikk"; private static final String TITLE = "cím"; privát statikus végső karakterlánc TARTALOM = "tartalom"; a Baeldung privát honlapja; privát String elemValue; @ A nyilvános érvénytelen karakterek felülírása (char [] ch, int start, int length) dobja a SAXException {elementValue = new String (ch, start, length); } @Orride public void startDocument () dobja a SAXException {website = new Baeldung (); } @Orride public void startElement (String uri, String lName, String qName, Attributes attr) dobja a SAXException {switch (qName) {eset CIKKEK: website.articleList = new ArrayList (); szünet; eset CIKK: website.articleList.add (új BaeldungArticle ()); }} @Orride public void endElement (String uri, String localName, String qName) dobja a SAXException {switch (qName) {eset TITLE: latestArticle (). Title = elementValue; szünet; eset TARTALOM: latestArticle (). content = elementValue; szünet; }} privát BaeldungArticle latestArticle () {List ArticleList = website.articleList; int latestArticleIndex = articleList.size () - 1; return articleList.get (latestArticleIndex); } public Baeldung getWebsite () {return webhely; }} 

Az olvashatóság növelése érdekében karakterlánc-állandókat is hozzáadtak. Ugyancsak kényelmes a legutóbbi cikk lekérése. Végül szükségünk van egy javítóra a Baeldung tárgy.

Ne feledje, hogy a fentiek nem biztonságosak, mivel a metódushívások között tartjuk az állapotot.

6. Az elemző tesztelése

Az elemző teszteléséhez példányosítjuk a SaxFactory, a SaxParser és a BaeldungHandler:

SAXParserFactory gyár = SAXParserFactory.newInstance (); SAXParser saxParser = factory.newSAXParser (); SaxParserMain.BaeldungHandler baeldungHandler = új SaxParserMain.BaeldungHandler (); 

Ezt követően elemezzük az XML fájlt, és azt állítjuk, hogy az objektum minden elemzett elemet tartalmaz:

saxParser.parse ("src / test / resources / sax / baeldung.xml", baeldungHandler); SaxParserMain.Baeldung eredmény = baeldungHandler.getWebsite (); assertNotNull (eredmény); Cikkek listája = result.getArticleList (); assertNotNull (cikkek); assertEquals (3, cikkek.méret ()); SaxParserMain.BaeldungArticle articleOne = articles.get (0); assertEquals ("XML fájl elemzése SAX elemző segítségével", articleOne.getTitle ()); assertEquals ("SAX Parser Lorem ipsum ...", articleOne.getContent ()); SaxParserMain.BaeldungArticle articleTwo = articles.get (1); assertEquals ("XML fájl elemzése a DOM elemző használatával", articleTwo.getTitle ()); assertEquals ("DOM Parser Lorem ipsum ...", articleTwo.getContent ()); SaxParserMain.BaeldungArticle articleThree = articles.get (2); assertEquals ("XML fájl elemzése a StAX elemző segítségével", articleThree.getTitle ()); assertEquals ("StAX Parser Lorem ipsum ...", articleThree.getContent ()); 

Ahogy az várható volt, a baeldung helyesen elemzett és tartalmazza a várt alobjektumokat.

7. Következtetés

Most fedeztük fel, hogyan lehet SAX-t használni az XML fájlok elemzéséhez. Ez egy hatékony API, amely könnyű memóriaméretet generál alkalmazásainkban.

Szokás szerint a cikk kódja elérhető a GitHubon.