假设我得到了一个 XML,如下所示:
<a><b><c>hello</c><d>world</d><e>again</e></b></a>
我得到了一个函数:getXmlStream,它具有以下签名:
def getXmlStream(xmlPath:String):Either[String,Option[NodeSeq]]
当我用传入的路径调用 getXmlStream 时,我会得到左边是错误,右边是 Option[NodeSeq]。
现在,如果 NodeSeq 不是 None,我需要获取元素 和 的值,它们分别是“hello”和“world”。
我尝试将元素取出如下:
val elems = (getXmlStream(xmlFilePath)) match {
case Left(error:String) => None
case Right(xmlStreamOpt) => {
xmlStreamOpt map {
(r \\ "c" text, r \\ "d" text)
}
}
}).getOrElse("","")
elems
遗嘱现在由一个元组组成,如果它们存在则具有值的元组,否则("hello","world")
它将是一个空字符串的元组。
我不认为我上面写的片段是惯用的 scala。有人可以建议我如何重构它。
我觉得第二个问题是我在片段中硬编码节点“c”和“d”。如果现在需要提取“e”,我会将表达式修改(r \\ "c" text, r \\ "d" text)
为(r \\ "c" text, r \\ "d" text, r \\ "e" text)
吗?是否可以使 xml 元素提取更加动态?