Piszę serię odpowiedzi XML z zewnętrznego magazynu danych. Podczas których muszę przetestować istnienie węzła podrzędnego i - jeśli istnieje - przetestować jego wartość. Aby to osiągnąć Mam następujący kod:Scala XML: test na istnienie węzła i wartość
...
val properties = for {
val row <- root \\ "ResultDescription"
val cond:Boolean = checkDetectionNode(row) match {
case Some(nodeseq) => {
val txt = nodeseq.text.toLowerCase
if (txt contains "non-detect")
false
else
true
}
case None => true
}
if (cond)
val name = (row \ "CharacteristicName").text
if (charNameList.exists(s => s == name) == false)
} yield {
getObservedProperty(name) match {
case Some(property) => {
charNameList = name :: charNameList
property
}
}
}
...
checkDetectionNode jest zdefiniowany jako takie:
private def checkDetectionNode(row: scala.xml.NodeSeq) : Option[scala.xml.NodeSeq] = {
if ((row \ "ResultDetectionConditionText") != null)
Some[scala.xml.NodeSeq]((row \ "ResultDetectionConditionText"))
else
None
}
Powyższe wyniki kodu w nieokreślonym błędem „nielegalną początku prostego wyrażenia” na linii val name...
. Szczerze mówiąc nie jestem programistą Scala, ani nawet programistą funkcjonalnym (zawsze był bardziej stronniczy od OO/imperatywu). Używam Scali tylko przez kilka dni i opieram większość tego, co wiem od Javy i operatorów lambda. Niestety, nie mam czasu, aby usiąść i naprawdę nauczyć się Scali, jakbym chciał. Terminy, zrób z nas wszystkich głupców.
Mam nadzieję, że ktoś może rzucić okiem i dać mi znać, jeśli coś jest nie tak (jak jestem pewien). Próbowałem ograniczyć wyświetlany kod, co mam nadzieję, jest istotne dla pytania. Daj mi znać, jeśli potrzebujesz dodatkowego kodu.
Dzięki
Chyba powinienem wyjaśnić, że powyższe jest częścią zrozumienia dla oświadczenia. "If (cond)" ma na celu określenie wykonania bloku yield. Zmieniłem moją odpowiedź, aby opracować więcej na temat kodu. – Cowan