2015-03-08 115 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