比方說我給定的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驗證。如果你能提供一個如何在這裏使用它的例子,那將是非常好的。 –