在模式匹配的某些情况下,如何添加XML节点?

在模式匹配的某些情况下,如何添加XML节点?,xml,scala,Xml,Scala,我希望节点test1、test2和test3仅在定义了选项时出现。 下面的代码可以工作,但是,我不喜欢test1,因为它不使用模式匹配,所以我需要调用option.get;我不喜欢test2,因为我有一个无用的行案例。我不喜欢test3,因为我有等效的.getOrElse。有没有一个很好的方法来实现这一点 val option: Option[Int] = None val node = <test> { if (option.isDefined) <test1&

我希望节点test1、test2和test3仅在定义了选项时出现。 下面的代码可以工作,但是,我不喜欢test1,因为它不使用模式匹配,所以我需要调用option.get;我不喜欢test2,因为我有一个无用的行案例。我不喜欢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>
怎么样

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

如果您将该选项转换为迭代器,那么我认为您得到了本机XML处理所需的语义,也应该与toList和其他工具一起使用。

您似乎只关心某些情况,而忽略了任何情况:

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>