Prosty interfejs API dla XML
Simple API for XML ( SAX ) jest de facto standardem , jeden interfejs programowania aplikacji (API) dla parsowania z XML opisuje dane. Obecna główna wersja, SAX 2.0, została opublikowana przez Davida Megginsona w 2000 roku i jest własnością publiczną . Parser SAX odczytuje dane XML jako sekwencyjny strumień danych i wywołuje zdefiniowane standardowe zdarzenia określone funkcje zwrotne (funkcja zwrotna) . Aplikacja korzystająca z SAX może zarejestrować swoje własne podprogramy jako funkcje zwrotne iw ten sposób oceniać dane XML.
Jak działa SAX
SAX został pierwotnie opracowany w Javie i składa się z wielu interfejsów Java , ale obecnie istnieją implementacje dla prawie wszystkich popularnych języków programowania. SAX nie podlega żadnemu formalnemu komitetowi ani konsorcjum, co jest raczej nietypowe dla specyfikacji XML, ale SAX jest de facto standardem. Określa szereg metod dostępu do dokumentów XML za pomocą parsera SAX. W przeciwieństwie do DOM SAX działa w sposób zorientowany na zdarzenia. Zasada przetwarzania odpowiada koncepcji rurociągu. SAX definiuje zestaw zdarzeń, które mogą wystąpić podczas sekwencyjnego czytania dokumentu XML. Zdarzenia te są bezpaństwowe, nie odnoszą się do innych, wcześniejszych wydarzeń i nie mają żadnego związku z innymi wydarzeniami. Po rozpoznaniu struktury składniowej parser SAX uruchamia procedurę obsługi, która w razie potrzeby wykonuje indywidualną procedurę obsługi zdarzenia.
Oznacza to, że ocenę dokumentu można rozpocząć już od wczytania pierwszych znaków. Skraca to subiektywnie postrzegany czas dostępu, szczególnie w systemach interaktywnych. Jednocześnie parser SAX minimalizuje zapotrzebowanie na pamięć, ponieważ oprócz elementu, który został wczytany, pamięć zawiera tylko dane, które zostały jawnie wybrane za pomocą procedury obsługi.
Zdarzenia SAX są generowane równolegle z odczytem dokumentu w parserze. W praktyce oznacza to, że mogą wystąpić zdarzenia SAX na źle sformułowanych dokumentach XML, zanim dokument zostanie uznany za nieważny. Dlatego obsługa błędów odgrywa ważną rolę w parserach SAX; odpowiednie klasy są dostępne w Javie. Sprawdzanie poprawności dokumentu XML za pomocą SAX przed jego analizą jest sprzeczne z naturą SAX, ponieważ wymagałoby to najpierw załadowania całego dokumentu do pamięci. Niemniej jednak istnieje wiele sprawdzających parserów SAX.
Wydarzenia w SAX
Podano następujący dokument:
<?xml version="1.0"?>
<seminararbeit>
<titel>DOM, SAX und SOAP</titel>
<inhalt>
<kapitel value="1">Einleitung</kapitel>
<kapitel value="2">Hauptteil</kapitel>
<kapitel value="3">Fazit</kapitel>
</inhalt>
</seminararbeit>
Jeśli pokazany dokument XML zostanie odczytany za pomocą parsera SAX, spowoduje to wyświetlenie następujących zdarzeń w kolejności
| Wydarzenie SAX | Wyjaśnienie |
|---|---|
startDocument()
|
Parser napotkał początek dokumentu XML |
startElement("seminararbeit",[])
|
"seminararbeit"znaleziono element o nazwie ; drugi parametr (nawiasy kwadratowe „[]”) to lista wszystkich atrybutów należących do elementu; jednak ponieważ ten element nie ma atrybutów, ta lista jest w tym przypadku pusta.
|
characters("\n ")
|
parser SAX wypisuje również wszystkie białe znaki, które znajdzie między dwoma znacznikami elementów; w tym przypadku jest to koniec wiersza (nowaLinia, "\ n"), po którym następuje spacja, która została użyta w kodzie XML jako wcięcie wiersza dla lepszej czytelności. |
startElement("titel",[])
|
|
characters("DOM, SAX und SOAP")
|
zawartość elementu "titel"
|
endElement("titel")
|
wskazuje, że osiągnięto koniec poprzednio znalezionego elementu |
characters("\n ")
|
|
startElement("inhalt",[])
|
|
characters("\n ")
|
ponieważ wcięcie w kodzie XML ma teraz 2 spacje, zdarzenie generuje również 2 spacje |
startElement("kapitel", ["value="1""])
|
drugi parametr zawiera listę wszystkich atrybutów; w tym przypadku lista zawiera tylko jeden element listy, a mianowicie „wartość = 1”. |
characters("Einleitung")
|
|
endElement("kapitel")
|
|
characters("\n ")
|
|
startElement("kapitel", ["value="2""])
|
|
characters("Hauptteil")
|
|
endElement("kapitel")
|
|
characters("\n ")
|
|
startElement("kapitel", ["value="3""])
|
|
characters("Fazit")
|
|
endElement("kapitel")
|
|
characters("\n ")
|
|
endElement("inhalt")
|
|
characters("\n")
|
ponieważ ta linia nie jest już wcięta w XML, tylko "\ n" (bez następujących spacji) jest wyprowadzane |
endElement("seminararbeit")
|
|
endDocument()
|
Parser osiągnął koniec dokumentu XML |
W przypadku wystąpienia zdarzenia parser przerywa pracę i czeka, aż osoba obsługująca dokument zwróci zezwolenie na pracę. W międzyczasie operator może rozpocząć rutynowe leczenie w celu oceny zdarzenia. Jednak procedury obsługi muszą być napisane tylko dla tych zdarzeń, które są również interesujące do dalszego przetwarzania - w przeciwnym razie kontrola jest natychmiast zwracana do parsera.
Praca z SAX
Przykład w Javie
W poniższym przykładzie w Javie tytuł i liczba rozdziałów należy odczytać jako część analizy dokumentu i wyprowadzić na końcu. Aby to zrobić, należy najpierw zaimportować odpowiednie klasy SAX i zainicjować parser SAX. Ponadto należy uruchomić procedurę obsługi dokumentów, która jest informowana o zdarzeniach przez parser. Ta procedura obsługi dokumentów zawiera następujące metody dla zdarzeń „znaki”, „startElement” i „endDocument” na przykład:
public int count = 0;
public boolean titel = false;
public String seminararbeit = "";
public void characters(char[] ch, int start, int length) throws SAXException {
if (titel == true && seminararbeit.equals("")) {
seminararbeit = new String(ch, start, length);
titel = false;
}
}
public void startElement(String name, AttributeList atts) throws SAXException {
if (name.equals("kapitel")) ++count;
if (name.equals("titel")) titel = true;
}
public void endDocument() throws SAXException {
System.out.println(seminararbeit + " enthält " + count + " Kapitel");
}
Przykład w Lua
W LuaExpat ( Lua z parserem SAX) tak zwane „ callbacki ” są najpierw przygotowywane do parsowania plików XML , za pomocą których parser może przesłać swoje dane do wywołującej go aplikacji. W tym przykładzie są to proste wywołania funkcji wyjściowych. Poniższy program wyprowadza plik XML jako zwykły tekst.
require "lxp"
xml_file="irgendeineXMLdatei.xml"
do
local count = 0
callbacks = {
StartElement = function (parser, name, attributes)
-- StartTag ausgeben--
io.write("+ ", string.rep(" ", count*2), name, "\n")
count = count + 1
-- Attribute ausgeben --
local attributename
for _,attributename in ipairs(attributes) do
io.write(" ", string.rep(" ", count*2),attributename,'="',attributes[attributename],'"\n')
end
end,
EndElement = function (parser, name)
-- Endtag ausgeben --
count = count - 1
io.write("- ", string.rep(" ", count*2), name, "\n")
end,
CharacterData = function (parser, text)
-- Text ausgeben --
io.write("----------\n",text, "\n----------\n")
end
}
end
p = lxp.new(callbacks) -- Generiere eine Instanz des Parsers
file = assert(io.open(xml_file .. "","r"))
p:parse(file:read("*all")) -- Parsen der gesamten Datei
-- (Auch zeilenweises Einlesen wäre möglich)
file:close();collectgarbage()
p:parse() -- Beendet das Dokument
p:close() -- Schließt den Parser
Zobacz też
- Streaming API for XML (StAX)
literatura
- David Brownell: SAX2 . O'Reilly, ISBN 0-596-00237-8
- Helmut Erlenkötter: XML Extensible Markup Language od samego początku . Rowohlt-Taschenbuch-Verlag, Reinbek koło Hamburga 2003, ISBN 3-499-61209-7 , s. 211-229.
- W. Scott Means, Michael A. Bodie: The Book of SAX . No Starch Press, ISBN 1-886411-77-8
linki internetowe
- Wprowadzenie do SAX (niemiecki)
- Numer referencyjny SAX (niemiecki)
- Strona internetowa projektu SAX (angielski)
- Samouczek XML Parser (niemiecki)
- Dziesięć najważniejszych wskazówek dotyczących SAX2 (w języku angielskim)
Indywidualne dowody
- ↑ SAX Szybki start
- ↑ Dokumentacja SAX API saxproject.org
- ↑ SAX Szybki start
- ↑ keplerproject.org