Projekt nr 4 - konwerter plików XMLa do listy asocjacyjnej
autor: Jakub Madej
-
Obsługiwane cechy języka XML
Program obsługuje język XML w wersji 1.1. W szególności rozpoznawane są następujące elementy języka:
- komentarze - są ignorowane
- elementy - są zapamiętywane w postaci symboli, których własnościami są: nazwa elementu, jego atrybuty oraz treść
- przestrzenie nazw - obsługiwane są przestrzenie wprowadzone za pomocą przedrostków nazw elementów oraz za pośrednictwem atrybutu xmlns, poza nazwą przestrzeni zapamiętywany jest także jej identyfikator URI, o ile jest określony
- znaki specjalne - wszystkie wystąpienia "<", ">", "&", "'" oraz """ są zastępowane przez odpowiednio "<", ">", "&", "'" oraz """
- cytowanie - cała treść zawarta między znacznikami "<![CDATA[" oraz "]]>" nie podlega interpretacji
-
Struktura programu
Program składa się z sześciu funkcji. Są to kolejno:
- string-subst2 - funkcja pomocnicza służąca do zamiany znaczników "<", ">", "&", "'" oraz """ na odpowiednie znaki; funkcja przyjmuje 11 argumentów - jest to 5 kolejnych łańcuchów tekstowych poszukiwanych w tekscie, łańcuchy, na które mają być zamienione oraz tekst; zwracany jest tekst po dokonaniu zamiany; równoczesne podmienianie kilku łańcuchów zapobiega sytuacjom, w których podmiana jednego łańcucha powoduje pojawienie się nowego podlegającego podmianie, a dokładnie dokonaniu tej podmiany
- usun-biale-znaki - funkcja ta przyjmuje jako parametr otwarty strumień wejściowy; czyta kolejne znaki tak długo, aż natknie się na znak nie będący spacją, tabulacją lub znakiem końca linii; używana jest jako funkcja pomocnicza do usuwanie białych znaków między kolejnymi elementami oraz między kolejnymi atrybutami
- usun-komentarz - funkcja ta przyjmuje jako parametr otwarty strumień wejściowy; czyta kolejne znaki ze strumienia i działa w sposób następujący:
- jeśli przeczytanym znakiem nie jest "<" oznacza to, że nie mamy do czynienia z komentarzem - funkcja wycofuje przeczytany znak do strumienia i przerywa działanie zwracając wartość nil, w przeciwnym razie działanie funkcji jest kontynuowane
- jeśli kolejnym przeczytanym znakiem nie jest "!" lub "?" funkcja wycofuje przeczytany znak do strumienia i przerywa działanie zwracając przedostatnio przeczytany znak (przyczyną takiego zachowania jest fakt, iż nie można zwrócić do strumienia więcej niż jednego znaku nie przeczytawszy kolejnego), w przeciwnym razie działanie funkcji jest kontynuowane
- funkcja odczytuje 7 kolejnych znaków, jeśli podczas odczytywania przeczytany zostanie znak ">" pętla jest przerywana
- jeżeli jako drugi znak został przeczytany "!" oraz odczytane 7 znaków tworzy łańcuch "<![CDATA[" to znaczy że mamy do czynienia z fragmentem chronionym przed interpretacja, w tej sytuacji kolejne znaki są odczytywany aż do wystąpienia "]]>", odczytany tekst jest zwracany
- jeżeli powyższy warunek nie jest spełniony kolejne znaki są odczytywane aż do wystąpienia znaku ">", ale nie są zapamiętywane (w tym przypadku mamy do czynienia z komentarzem)
- wywoływana jest funkcja usun-biale-znaki a następnie kolejny raz usun-komentarz
- wczytaj-wezel - funkcja przyjmuje jako parametry strumień, z którego ma czytać oraz, opcjonalnie, przestrzeń nazw, w którym ma się znaleźć odczytany element; funkcja odczytuje nazwę, atrybuty oraz treść elementu, a także (przez wywołanie rekurencyjne) elementy potomne; zwracany jest symbol, z którym skojarzony jest dany element
- wczytaj - funkcja przyjmuje jako parametr plik xml do przetworzenia, zwracany jest symbol skojarzony z dokumentem (dokładniej z głównym symbolem w dokumencie)
- wypisz - funkcja testowa wypisująca na ekran odczytaną listę asocjacyjną; dla zachowania przejrzystości wyświetlane są jedynie nazwy i atrybuty elementów
- Obsługa programu
Główną funkcją jest funkcja "wczytaj" - przyjmuje ona jako argument plik xml do przetworzenia, a zwraca skojarzony z dokumentem (czyli elementem głównym dokumentu) symbol. Symbol ten posiada następujące właściwości:
- nazwa - przechowuje nazwę elementu w postaci łańcucha tekstowego
- atrybuty - przechowuje listę atrybutów elementu oraz ich wartości; elementy listy są dwuelementowymi listami; pierwszy element jest łańcuchem opisującym nazwę atrybutu, drugi element łańcuchem zawierającym jego treść
- przestrzen - przechowuje symbol opisujący przestrzeń nazw, w której umieszczony jest dany symbol; wartość nil oznacza przestrzeń domyślną; symbol ma następujące własności:
- nazwa - przechowuje łańcuch tekstowy zawierający nazwę przestrzeni lub nil jeśli nazwa nie jest określona
- URI - łańcuch tekstowy zawierający identyfikator URI przestrzeni lub nil jeśli identyfikator nie jest określony
- wezly - zawiera listę elementów pochodnych (w postaci listy symboli)
- tresc - łańcuch tekstowy zawierający treść elementu