【发布时间】:2018-07-23 20:05:53
【问题描述】:
与This topic相关
问题如下,想象一个没有任何特定模式的 XML
<persons>
<total>2</total>
<someguy>
<firstname>john</firstname>
<name>Snow</name>
</someguy>
<otherperson>
<sex>female</sex>
</otherperson>
</persons>
对于处理,我想在键值映射中使用它:
"Persons/total" -> 2
"Persons/someguy/firstname" -> john
"Persons/someguy/name" -> Snow
"Persons/otherperson/sex" -> female
最好我有一些很好的递归函数,我在其中深度优先遍历 XML 代码并简单地堆叠所有标签,直到找到一个值并将该值与标签堆栈一起返回。不幸的是,当我返回输入序列时,我正在努力将返回类型与输入类型连接起来。让我向您展示我到目前为止所拥有的,显然 foreach 是一个问题,因为它返回 Unit,但地图也不会工作,因为它返回一个 Seq。
def dfs(n: NodeSeq, keyStack: String, map: Map[String,String])
:(NodeSeq, String, Map[String,String]) = {
n.foreach(x => {
if (x.child.isEmpty) {
dfs(x.child, keyStack, map + (keyStack+ x.label + " " -> x.text))
}
else {
dfs(x.child, keyStack+ x.label + "/", map)
}
}
)
}
非常感谢您的帮助!
【问题讨论】:
-
如果你得到
Seq[(String, String)],你可以打电话给.toMap来获取地图。 -
无论如何,如果您允许在 XML 中进行任意级别的嵌套,则不应在 foreach/map/flatMap 等函数的参数中进行递归调用 - 您可以在 @987654327 中编写另一个辅助函数@ 将累积处理每个
n的结果,并在最后将它们连接起来。 -
我知道可以这样做,但是每个 xml 都可以深度优先遍历,因此应该可以遍历和创建地图,最好以递归方式