如何为模式匹配中的某些情况添加XML节点?

时间:2015-01-31 20:39:18

标签: xml scala

我希望节点test1,test2和test3仅在定义option时出现。 下面的代码可行,但是,我不喜欢test1,因为它不使用模式匹配(所以我需要调用option.get);我不喜欢test2,因为我有一条无用的行case _ =>。而且我不喜欢test3,因为我有等效的.getOrElse(())。有没有很好的方法来实现这个目标?

val option: Option[Int] = None

val node =
  <test>
    { if (option.isDefined) <test1>{option.get}</test1> }

    { option match {
        case Some(x) => <test2>{x}</test2>
        case _ =>
    }}

    { option.map(x => <test3>{x}</test3>).getOrElse(()) }
  </test>

2 个答案:

答案 0 :(得分:4)

怎么样

val node = <test> { option.iterator.map(x => <test1>x</test1>) } </test>

如果您将Option转换为Iterator,那么我认为您可以使用原生XML处理来获取您正在寻找的语义(也应该与toList和其他人一起使用)。

答案 1 :(得分:0)

在忽略Some的情况下,您似乎只关注None案例:

def f(o: Option[Int]): scala.xml.Elem =
  <test>
  {
    o match {
      case Some(x) => <test1>{x}</test1><test2>{x}</test2><test3>{x}</test3>
      case None => xml.NodeSeq.Empty
    }
  }
  </test>