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.