Java SAX Parser - przegląd
SAX (Simple API for XML) to oparty na zdarzeniach parser dokumentów XML. W przeciwieństwie do parsera DOM, parser SAX nie tworzy drzewa parsowania. SAX jest interfejsem strumieniowym dla XML, co oznacza, że aplikacje korzystające z SAX otrzymują powiadomienia o zdarzeniach dotyczących przetwarzanego dokumentu XML, elementu i atrybutu, w czasie w kolejności sekwencyjnej, począwszy od góry dokumentu, a kończąc na zamknięciu elementu Element ROOT.
Odczytuje dokument XML od góry do dołu, rozpoznając tokeny, które składają się na dobrze sformułowany dokument XML.
Tokeny są przetwarzane w tej samej kolejności, w jakiej pojawiają się w dokumencie.
Informuje aplikację o naturze tokenów napotkanych przez parser w momencie ich wystąpienia.
Aplikacja udostępnia procedurę obsługi „zdarzenia”, którą należy zarejestrować w parserze.
Gdy tokeny są identyfikowane, wywoływane są metody wywołania zwrotnego w module obsługi z odpowiednimi informacjami.
Kiedy użyć?
Powinieneś użyć parsera SAX, gdy -
Możesz przetwarzać dokument XML w sposób liniowy od góry do dołu.
Dokument nie jest głęboko zagnieżdżony.
Przetwarzasz bardzo duży dokument XML, którego drzewo DOM zużywałoby zbyt dużo pamięci. Typowe implementacje DOM używają dziesięciu bajtów pamięci do reprezentowania jednego bajtu XML.
Problem do rozwiązania dotyczy tylko części dokumentu XML.
Dane są dostępne, gdy tylko zostaną odczytane przez parser, więc SAX działa dobrze w przypadku dokumentu XML, który pojawia się w strumieniu.
Wady SAX
Nie mamy losowego dostępu do dokumentu XML, ponieważ jest on przetwarzany tylko do przodu.
Jeśli chcesz śledzić dane, które parser widział lub zmienić kolejność elementów, musisz samodzielnie napisać kod i przechowywać dane.
Interfejs ContentHandler
Ten interfejs określa metody wywołania zwrotnego, których parser SAX używa do powiadamiania aplikacji o składnikach dokumentu XML, które widział.
void startDocument() - Wywołane na początku dokumentu.
void endDocument() - Wywołane na końcu dokumentu.
void startElement(String uri, String localName, String qName, Attributes atts) - Wywoływane na początku elementu.
void endElement(String uri, String localName,String qName) - Wywoływane na końcu elementu.
void characters(char[] ch, int start, int length) - Wywoływane w przypadku napotkania danych postaci.
void ignorableWhitespace( char[] ch, int start, int length) - Wywoływane, gdy obecne jest DTD i napotkano ignorowalne białe znaki.
void processingInstruction(String target, String data) - Wywoływane po rozpoznaniu instrukcji przetwarzania.
void setDocumentLocator(Locator locator)) - Zapewnia lokalizator, którego można użyć do identyfikacji pozycji w dokumencie.
void skippedEntity(String name) - Wywoływane w przypadku napotkania nierozwiązanej jednostki.
void startPrefixMapping(String prefix, String uri) - Wywoływane, gdy zdefiniowano nowe odwzorowanie przestrzeni nazw.
void endPrefixMapping(String prefix) - Wywoływane, gdy definicja przestrzeni nazw kończy swój zakres.
Interfejs atrybutów
Ten interfejs określa metody przetwarzania atrybutów połączonych z elementem.
int getLength() - Zwraca liczbę atrybutów.
String getQName(int index)
String getValue(int index)
String getValue(String qname)