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)

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.