使用null属性过滤XML元素

时间:2017-07-26 02:04:04

标签: scala scala-xml

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

我不知道为什么以下内容不起作用(请参阅答案为什么我有想法测试而不是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元素

1 个答案:

答案 0 :(得分:1)

刚想出来了。 filter并未null,而是NodeSeq(),以便以下工作:

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

关注this Q&amp; A,了解如何手动创建NodeSeq()对象

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

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

我最初想到的是对null进行测试。当然,如果我坚持这一点,我最初的方法就会奏效:

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