xml - Scala:给定一个 scala.xml.Node,获取第二个(或第 n 个)子元素的最有效方法是什么?

标签 xml scala

给定 scala.xml.Node对象(以空白和元素作为子节点)获取第二个(或第 n 个)子元素的最有效方法是什么?

通常我会选择内置的 (node \ "foo") ,但有时我必须依赖元素的位置。例如,我可以有两个选择组,可以是 foobar 。该文档可以是

<something>
  <foo/>
  <foo/>
</something>

<something>
  <foo/>
  <bar/>
</something>

等等

最佳答案

我喜欢 Retronym 的 drop(n).headOption当您的 child 少于 n 时,它会说明这一模式。但我认为你的意思是第二个子节点(不包括文本节点),而不是 <foo> 的第二个实例。标签。考虑到这一点,结合您的答案或使用 partialMap :

node.child.partialMap{case x:scala.xml.Elem => x}.drop(n).headOption

node.child.filter(_.isInstanceOf[scala.xml.Elem]).drop(n).headOption

这必须假设您不想在以下位置提取文本:

val node = <something><foo/>text</something>

从效率角度来说,如果您想在有大量子项时检索第二个子项,我唯一能想到的另一件事就是使过滤器变得懒惰。我认为这可以通过在 node.child.iterator 上运行过滤器来实现相反。

编辑: 已更改toIterableiterator 。 好点,调用drop(n)ArrayBuffer上会导致额外的分配,也很难说有多少,因为看起来 dropIndexSeqLike 覆盖。但使用迭代器也可以解决这个问题。所以对于大量的 child 来说:

node.child.iterator.filter(_.isInstanceOf[scala.xml.Elem]).drop(n).next

如果你想让它安全,你可能需要定义一个函数来检查 hasNext .

所有这些仅在 2.8 中进行了测试。

关于xml - Scala:给定一个 scala.xml.Node,获取第二个(或第 n 个)子元素的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2286337/

相关文章:

python - 值错误 : Cannot assign in django

python - 在保留属性的同时使用 lxml.objectify 替换节点文本

scala - Spark 中的 Hadoop 配置

Scala Play 2.5.0 2.5.1 通过访问结果主体进行过滤

scala - 如何使用scala找到元组值?

标识符中下划线的 Scala 样式指南

c++ - Qt 自动保存 XML 文件

c# - Linq to XML - 根据 if 语句设置 Xelement 值

java - 启动 100 个按钮的更有效方法

scala - 是否可以从对象导入所有变量?