过滤 XML 个具有空属性的元素
Filtering XML elements with null attributes
我正在尝试从常规 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
步骤之后?
刚刚弄明白了。 filter
不是 return null
,而是 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)
我正在尝试从常规 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
步骤之后?
刚刚弄明白了。 filter
不是 return null
,而是 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)