2017-07-26 8 views
2

通常の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) 

代わりに私がmapステップの後NodeSeq()要素を除外することができるか、(これは内部的に最適化されていると仮定した場合)?

答えて

1

これをわかりました。

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

続くthis Q & A私は最終的に私の問題を発見し


手でNodeSeq()オブジェクトを作成する方法を発見するために、次の作品がするようfilterは、NodeSeq()nullを返しますが、いませんでした自分のワイヤーを横切って派生したものです。私は当初、以下の使用していた:私はもともと対nullをテストするためのアイデアを得たところ

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

です。もちろん、私がそれにこだわっていた場合、私の初期のアプローチはうまくいきました。

test.child.filter(_.attributes("attr") != null).map(_ \ "@attr") 
// ArrayBuffer(1, 2) 
関連する問題