21.1. Tworzenie struktur XML-owych
Język Scala udostępnia składniowe wsparcie dla wyrażeń XML umieszczanych bezpośrednio w kodzie programu. Kompilator parsuje takie wyrażenia i w przypadku, gdy uzna je za poprawnie zbudowane, zamienia je na odpowiednie struktury danych. Poniższy przykład pokazuje utworzenie wartości a, będącej elementem XML o nazwie p.
scala> val a = <p/> a: scala.xml.Elem = <p/>
Po sparsowaniu wyrażenia XML został utworzony obiekt typu scala.xml.Elem, reprezentujący element XML. Kolejny przykład pokazuje utworzenie trochę większej struktury danych.
scala> val b = <p id="hello"><b>hello</b></p> b: scala.xml.Elem = <p id="hello"><b>hello</b></p>
Niepoprawne składniowo fragmenty XML nie są poprawnie parsowane. Poniższy przykład prezentuje nieprawidłowy składniowo fragment XML — brakuje zamykającego znacznika elementu b.
scala> val c = <p><b>hello</p>
<console>:1: error: in XML literal: expected closing tag of b
val c = <p><b>hello</p>
^
<console>:1: error: start tag was here: b>
val c = <p><b>hello</p>
^
Wewnątrz wyrażeń XML można umieszczać zwykłe wyrażenia języka Scala. W tym celu należy je umieścić w nawiasach klamrowych. W celu umieszczenia w strukturze XML samych znaków nawiasów klamrowych można umieścić je w wyrażeniu podwójnie (bezpośrednio jeden po drugim).
scala> val d = <p>{ 1+2 }</p>
d: scala.xml.Elem = <p>3</p>
scala> val e = <p class={ "abcde".take(4) }>{{xyz}}</p>
e: scala.xml.Elem = <p class="abcd">{xyz}</p>
Wyrażenia XML oraz zwykłe wyrażenia języka Scala mogą być wzajemnie zagnieżdżane.
scala> val f = <p>{ for(n <- 1 to 4) yield <b>{ n }</b> }</p>
f: scala.xml.Elem = <p><b>1</b><b>2</b><b>3</b><b>4</b></p>
Oprócz zwykłych elementów, wyrażenia XML mogą również zawierać komentarze, instrukcje przetwarzania, sekcje CDATA oraz jednostki.
scala> val g = <!-- comment -->
g: scala.xml.Comment = <!-- comment -->
scala> val h = <?file name="a.txt"?>
h: scala.xml.ProcInstr = <?file name="a.txt"?>
scala> val i = <![CDATA[<abc>]]>
i: scala.xml.Text = <abc>
scala> val j = <a>{g}{h}{i}&</a>
j: scala.xml.Elem = <a><!-- comment --><?file name="a.txt"?><abc>&</a>
![]() | W analizie leksykalnej języka Scala używane są dwa tryby pracy: tryb języka Scala oraz tryb XML. Analizator leksykalny przełącza się w odpowiednich miejscach między tymi trybami pracy, co umożliwia opisane w tym punkcie wzajemne zagnieżdzanie kodu Scali oraz wyrażeń XML. Specyfikacja języka Scala opisuje tryb XML w punkcie 1.5, a wyrażenia XML w punkcie 10.1. |

