[ОБНОВЛЕНО]
Только что понял, что вы спрашивали о фигурных скобках в тексте, а не о синтаксических скобках, связанных с XML.
Возможный ответ:
scala> val xml = <a>
<prop>{{key1}}</prop>
<prop>{{key2}}</prop>
<prop>notkey</prop>
</a>
xml: scala.xml.Elem = <a><prop>{key1}</prop><prop>{key2}</prop><prop>notkey</prop></a>
Я удвоил {
и }
, чтобы избежать скобок, потому что Scala рассматривает {
переменную }
как замену:
scala> val text="all your base are belong to us"
text: java.lang.String = all your base are belong to us
scala> val template = <a>{text}</a>
template: scala.xml.Elem = <a>all your base are belong to us</a>
Теперь вернемся к работе.
Чтобы взять только prop's
, используйте \
оператор проекции, который принимает подузлы с заданным именем. Чтобы взять все вложенные узлы в дереве xml, используйте \\
.
scala> val props = xml\"prop"
props: scala.xml.NodeSeq = NodeSeq(<prop>{key1}</prop>, <prop>{key2}</prop>, <prop>notkey</prop>)
val keys = props.filter (p => p.text.startsWith("{"))
res3: scala.xml.NodeSeq = NodeSeq(<prop>{key1}</prop>, <prop>{key2}</prop>)
На самом деле, меня здесь обманывают, и я предполагаю, что поле нежелательного свойства не может существовать в форме {notkey . Вы можете переписать код для фильтрации ключей другим способом (например, используя регулярные выражения)
scala> for(k <- keys) {
| println(k.label+":"+k.text)
| }
prop:{key1}
prop:{key2}