21.6. Słownik
W tym punkcie pokazany jest trochę większy przykład. Plik dict.xml zawiera słownik ze słowami w językach angielskim i francuskim (jest to bardzo ubogi słownik, w sam raz nadający się na przykład i na niewiele więcej).
Plik dict.xml: <?xml version='1.0' encoding='utf-8'?> <dict> <entry kind="noun"> <en><word>book</word></en><fr><word>livre</word><gender>m</gender></fr> </entry><entry kind="verb"> <en><word>go</word></en><fr><word>aller</word></fr> </entry><entry kind="noun"> <en><word>car</word></en><fr><word>voiture</word><gender>f</gender></fr> </entry><entry kind="verb"> <en><word>call</word></en><fr><word>appeler</word></fr> </entry><entry kind="noun"> <en><word>computer</word></en><fr><word>ordinateur</word><gender>m</gender></fr> </entry> </dict>
Zawartość pliku składa się z elementu dictionary, który zawiera sekwencję elementów entry. Element entry reprezentuje pojedynczy wpis w słowniku. Ten element posiada atrybut kind, określający czy wpis zawiera czasownik (ang. verb), czy rzeczownik (ang. noun). Każdy z elementów entry zawiera elementy en i fr, reprezentujące odpowiednio angielski i francuski odpowiednik słowa. W obu elementach znajduje się element word, zawierający tekstową reprezentację słowa. Elementy fr, reprezentujące rzeczowniki, posiadają dodatkowo element gender, reprezentujący rodzaj gramatyczny rzeczownika (m — męski, f — żeński). Program z pliku DictXmlToTxt.scala korzysta z pliku słownika i służy do wyświetlenia na ekranie informacji w nim zawartych w postaci tekstowej.
Plik DictXmlToTxt.scala: import xml._ object DictXmlToTxt { def main(args: Array[String]) { val dict:Node = XML.loadFile("dict.xml")
println(this(dict)) } def apply(dict:Node) = { def convertEntries = for {
entry <- dict \ "entry" en = (entry \ "en" \ "word").text
fr = (entry \ "fr" \ "word").text
str = entry.attribute("kind") match {
case Some(n) if n.text == "noun" => val frGender = (entry \ "fr" \ "gender").text
"[noun] " + en + " - " + fr + " (" + frGender + ")" case Some(n) if n.text == "verb" => "[verb] " + en + " - " + fr case _ => "" } } yield str convertEntries.mkString("\n")
} }
Metoda loadFile obiektu scala.xml.XML, użyta w wierszu , wczytuje
i zwraca zawartość pliku podanego w jej argumencie. Metoda apply
przekształca dane XML na postać tekstową poprzez przekształcanie
poszczególnych wpisów słownikowych (przy użyciu metody
convertEntries) na ciąg wartości tekstowych, a następnie poprzez
połączenie ich w jedną wartość tekstową w wierszu
. Pętla for, z
wiersza
, przechodzi przez kolejne elementy entry słownika. W
wierszach
,
i
program odczytuje angielskie i francuskie
tłumaczenia oraz rodzaj gramatyczny francuskiego rzeczownika. Tekstowa
postać wpisu jest zapisywana w wartości str, a jej kształt zależy od
tego, czy mamy do czynienia z czasownikiem, czy rzeczownikiem. Wartość
frGender jest zdefiniowana w jednej z klauzul case wyrażenia
match, ponieważ ta wartość interesuje nas tylko w przypadku
rzeczowników. Informacja o tym z jaką częścią mowy mamy do czynienia
jest odczytywana w wierszu
przy użyciu metody attribute. Poniższe
polecenie uruchamia program.
$ scala DictXmlToTxt [noun] book - livre (m) [verb] go - aller [noun] car - voiture (f) [verb] call - appeler [noun] computer - ordinateur (m)