2012年9月30日 星期日

Groovy與XML的相遇(三) : 如何找到節點

這一次就不寫 Java Code了,因為用傳統的寫法會發瘋。

一樣,以剛剛那個xml為範例

<root>
  <star age='22' blood='A'>布萊德彼特1</star>
  <star age='26' blood='C'>小勞勃道尼</star>
  <star age='24' blood='B'>基努李維</star>
</root> 

(明明他們就沒那麼年輕…)

問題1:  找到年紀小於25歲的男星,我只要他們的名字

println roots.star.find{  it.@age <=25 }.text() 

下底線又用了閉包傳入。很簡單吧! 可是執行失敗說!
因為xml讀進來都是字串啊,Groovy沒有人工智慧。
好,那怎麼辦…? 你如果有從我第一篇開始看,你應該記得轉型吧。

println roots.star.find{  it.@age as int <=25 }.text() 

你很快樂的按下去,不過結果還是錯的,你不要把Groovy當神好嗎。

println roots.star.find{  (it.@age as int) <=25 }.text() 

加個括號就行了。是那裡面的東西要轉成 int ,後面再來比條件。
問題1的解法,一行結束! 不過剛剛符合條件的男星有二個耶 ?
find 只會傳出第一個 match 的。
findAll 會傳出都符合條件的。於是我們再試一次

List list = roots.star.findAll{  (it.@age as int)  <=25 } as List
 

沒錯,還順便轉了型,裡面裝好了 groovy.util.Node。
List<groovy.util.Node> 啦。

問題2 : 把這些明星的年紀由小到大排序,呃,我要大於23歲的。然後裝成 List<Integer>。

當然以Groovy來說一定要秒殺解決的。


List list2 = (roots.star.@age.findAll{ (it as int ) >=23 } as List).sort()


我把這一行一個一個說明;
  • 取得root下的所有明星節點,但是我要他們的age而已,這時候已經是單純 age 的字串集合了。
  • 從這個結果中,幫我找 age 集合中年紀大於23 歲的,並轉型成 list。
  • 然後再排序。

是不是很方便呢? 其它的進階 xml 密技,就給你自己去研究了 !



沒有留言:

張貼留言