如何在没有根节点的情况下返回NodeSeq?

时间:2018-02-17 16:49:45

标签: xml scala parsing

我是Scala的新手,我在一个完全用Scala编写的项目中工作,我想修改一个包含返回NodeSeq的方法的case类,但所有类参数都是Optional,我应该返回只是将可用参数解析为NodeSeq。

我不知道我做错了什么,但是它只是返回序列中第一个元素的方法:

case class Address(
                        street: Option[String],
                        number: Option[String],
                        complement: Option[String],
                        district: Option[String],
                        city: Option[String],
                        state: Option[String],
                        country: Option[String],
                        postalCode: Option[String]
                      ) {
  def toXml: NodeSeq =
    {street.map(x => <street>{x}</street>).orNull}
    {number.map(x => <number>{x}</number>).orNull}
    {complement.map(x => <complement>{x}</complement>).orNull}
    {district.map(x => <district>{x}</district>).orNull}
    {city.map(x => <city>{x}</city>).orNull}
    {state.map(x => <state>{x}</state>).orNull}
    {country.map(x => <country>{x}</country>).orNull}
    {postalCode.map(x => <postalCode>{x}</postalCode>).orNull}
}

1 个答案:

答案 0 :(得分:2)

您的代码被解析为

def toXml: NodeSeq = {
  street.map(x => <street>{x}</street>).orNull
}

{number.map(x => <number>{x}</number>).orNull}
{complement.map(x => <complement>{x}</complement>).orNull}
/* etc */

第一行是toXml函数的主体,之后的所有内容都转到类的主体,因此是类构造函数的一部分。

在您的情况下,最简单的方法可能是采用空的NodeSeq并将每个Option[Node]添加到其中。

def toXml: NodeSeq = NodeSeq.Empty ++
  street.map(x => <street>{x}</street>) ++
  number.map(x => <number>{x}</number>) ++
  complement.map(x => <complement>{x}</complement>) ++
  district.map(x => <district>{x}</district>) ++
  city.map(x => <city>{x}</city>) ++
  state.map(x => <state>{x}</state>) ++
  country.map(x => <country>{x}</country>) ++
  postalCode.map(x => <postalCode>{x}</postalCode>)