2015-03-08 109 views
2

我想解析Scala中的XML使用scala.xml.XML,我想避免必須通過XPath傳遞字符串到XML Elem才能獲得NodeSeq。Scala XML解析與Xpath

必須在多個地方指定像elem \\ "tag1" \\ "tag2" \\ "@tagN"這樣的字符串似乎很脆弱且重複。

大部分的Scala XML解析教程都解析XPath硬編碼字符串jank - elem \\ "tag1" \\ "tag2" \\ "@tagN" - 無處不在。

是否有可能編寫一個方法,通過XPath通過Seq [String]搜索Elem並返回一個NodeSeq?

的方法看起來是這樣的:

def getNodeFromXml(elem: Elem, tags: Seq[String]): NodeSeq = { 
    Returns a NodeSeq elem \\ tags(0) \\ tags(1) \\ ... \\ tags(tags.length) 
} 

感謝

回答

3

喜歡的東西:

scala> import xml._ 
import xml._ 

scala> val x = <top><middle><bottom>text</bottom></middle></top> 
x: scala.xml.Elem = <top><middle><bottom>text</bottom></middle></top> 

scala> val names = Seq("middle","bottom") 
names: Seq[String] = List(middle, bottom) 

scala> val ns: NodeSeq = x 
ns: scala.xml.NodeSeq = <top><middle><bottom>text</bottom></middle></top> 

scala> names.foldLeft(ns)((e,s) => e \\ s) 
res2: scala.xml.NodeSeq = NodeSeq(<bottom>text</bottom>) 
+0

這比我想的方法更清潔。 我試圖使用遞歸傳遞Seq的NodeSeq +尾部,當seq.length爲1時,返回最終的NodeSeq。 我試圖使用集合內置插件,但從來沒有想過使用foldLeft。感謝你的分享! – Anthony 2015-03-08 21:09:00