gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:55:20 25 4
gpt4 key购买 nike

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

通常我会选择内置的(node\"foo"),但有时我不得不依赖元素的位置。例如,我可以有两个 Choice 组,它们可以是 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>

效率方面,我唯一能想到的另一件事是如果你想在有大量 child 时检索第二个 child ,则使过滤器变得惰性。我认为这可以通过在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com