2

我正在尝试从常规 XML 结构中提取属性;首先排除缺少特定属性的元素似乎很自然。

我不知道为什么以下方法不起作用(请参阅答案,了解为什么我有过测试 vs. 的想法null):

val test = <top><el attr="1"></el><el></el><el attr="2"></el></top>
test.child.filter(_ \ "@attr" != null).map(_ \ "@attr")
// ArrayBuffer(1, NodeSeq(), 2)

为什么中间元素仍然存在filter

我已经确认它不是运算符优先级:

test.child.filter(x => (x \ "@attr") != null).map(_ \ "@attr")
// ArrayBuffer(1, NodeSeq(), 2)

或者(假设这是内部优化的),我如何在步骤之后NodeSeq()排除元素?map

4

1 回答 1

1

刚刚想通了。filter不是 return null, but NodeSeq(),因此以下工作:

test.child.filter(_ \ "@attr" != scala.xml.NodeSeq.Empty).map(_ \ "@attr")
// ArrayBuffer(1, 2)

按照问答了解如何NodeSeq()手动创建对象


我发现我的问题最终源于我自己的电线。我最初一直在使用以下内容:

test.child.map(_.attributes("attr"))
// ArrayBuffer(1, null, 2)

这就是我null最初产生测试与测试的想法的地方。当然,如果我坚持这一点,我最初的方法会奏效:

test.child.filter(_.attributes("attr") != null).map(_ \ "@attr")
// ArrayBuffer(1, 2)
于 2017-07-26T02:17:33.417 回答