比方说我给定的XML如下:优雅的方式来从任一提取元素值[字符串,选项[NodeSeq]]
<a><b><c>hello</c><d>world</d><e>again</e></b></a>
我给定的函数:getXmlStream其具有以下特征:
def getXmlStream(xmlPath:String):Either[String,Option[NodeSeq]]
当我调用getXmlStream并传入一个路径时,我会得到左边是错误,右边是选项[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元素提取更具动态性?
如何使用斯卡拉斯验证?这是一个很好的改进,要么 – Edmondo1984
@ Edmondo1984 - 谢谢。我不熟悉Scalaz验证。如果你能提供一个如何在这里使用它的例子,那将是非常好的。 –