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 = &lt;abc&gt;

scala> val j = <a>{g}{h}{i}&amp;</a>
j: scala.xml.Elem = <a><!-- comment --><?file name="a.txt"?>&lt;abc&gt;&amp;</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.

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.