2017-07-26 66 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) 

或者(假設這是內部優化),我怎麼能排除NodeSeq()元素map步驟之後?

回答

1

只是想出了這一點。 filter沒有返回null,但NodeSeq(),使以下工作:

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

其次this Q &一個發現如何手工創建NodeSeq()對象


我最終發現我的問題源自穿過我自己的電線。最初我一直在使用下列內容:

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

這是我得到了主意,測試與null原本。當然,如果我堅持這一點,我的初步方法將工作:

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