加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:38:03 所属栏目:安全 来源:网络整理
导读:我正在从外部数据存储解析一系列 XML响应.在此期间,我必须测试是否存在子节点,并且 – 如果存在 – 测试其值.为此,我有以下代码: ... val properties = for { val row - root "ResultDescription" val cond:Boolean = checkDetectionNode(row) match { c
我正在从外部数据存储解析一系列 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
      }
    }
  }
...

checkDetectionNode定义如下:

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

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

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

谢谢

解决方法

xml在这里分散注意力.问题是最后的if(cond)不是作为一个守卫,它只是看起来应该是,编译器认为是一个新的if’then’部分的开始.

在以下示例中:

val l = List(1,2,3,4,5)

val r = for {
    i <- l 
      if (i > 2)
    x <- Some(i * 2)
  } yield x

如你所料,你会获得List(6,8,10).

运用

val r = for {
    val i <- l if (i > 2)
    val x <- Some(i * 2)
  } yield x

应该给你一个弃用警告,和

val r = for {
    val i <- l 
    if (i > 2)
    val x <- Some(i * 2)
  } yield x

得到

error: illegal start of simple expression
  val x <- Some(i * 2)

只需移除发电机前面的val(Pattern1′< - 'Expr [Guard]),即可恢复正常服务.如果没有我找到的for循环中的val,它也会更好地流动.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读