Scala XML:测试节点的存在和价值

Cow*_*wan 5 xml scala

我正在从外部数据存储解析一系列XML响应.在此期间,我必须测试是否存在子节点,并且 - 如果存在 - 测试其值.为此,我有以下代码:

...
  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
      }
    }
  }
...
Run Code Online (Sandbox Code Playgroud)

checkDetectionNode定义如下:

private def checkDetectionNode(row: scala.xml.NodeSeq) : Option[scala.xml.NodeSeq] = {
  if ((row \ "ResultDetectionConditionText") != null)
    Some[scala.xml.NodeSeq]((row \ "ResultDetectionConditionText"))
  else
    None
}
Run Code Online (Sandbox Code Playgroud)

上面的代码导致行上的"非法启动简单表达"的未指定错误val name....说实话,我不是Scala程序员,甚至不是函数式程序员(总是更偏向于OO /命令式).我已经使用Scala几天了,并且基于Java和lambda运算符基于我所知道的大部分内容.不幸的是,我没有时间坐下来像我希望的那样真正学习Scala.截止日期,愚弄我们所有人.

我希望有人可以看看并告诉我是否有什么我做错了(因为我确信有).我试图限制显示的代码,我希望,与问题相关.但是,如果需要任何其他代码,请告诉我.

谢谢

小智 1

xml 在这里是一个干扰。问题是最后的 if (cond) 并没有起到保护作用,它只是看起来应该起到保护作用,编译器认为这是新的 if 'then' 部分的开始。

\n\n

在以下示例中:

\n\n
val l = List(1,2,3,4,5)\n\nval r = for {\n    i <- l \n      if (i > 2)\n    x <- Some(i * 2)\n  } yield x\n
Run Code Online (Sandbox Code Playgroud)\n\n

你会得到 List(6,8,10) 正如你所期望的。

\n\n

使用

\n\n
val r = for {\n    val i <- l if (i > 2)\n    val x <- Some(i * 2)\n  } yield x\n
Run Code Online (Sandbox Code Playgroud)\n\n

应该给你一个弃用警告,并且

\n\n
val r = for {\n    val i <- l \n    if (i > 2)\n    val x <- Some(i * 2)\n  } yield x\n
Run Code Online (Sandbox Code Playgroud)\n\n

得到

\n\n
error: illegal start of simple expression\n  val x <- Some(i * 2)\n
Run Code Online (Sandbox Code Playgroud)\n\n

只需删除生成器前面的 val (Pattern1 \xe2\x80\x98<-\xe2\x80\x99 Expr [Guard]),即可恢复正常服务。我发现,在 for 循环中没有 vals 时,它的流动性也会更好一些。

\n