2011年11月04日

Scala -標準ライブラリでXMLのパースとか-

ちょっとだけXMLをパースする必要があったので、メモがてら。

例えば下記のよなtwitterのfollow,followerリストのXMLがあったとして、

<?xml version="1.0" encoding="UTF-8"?>

<my_users>
<follow>
<account><id>1</id><name>相互followさん</name><follower_num>1</follower_num></account>
<account><id>2</id><name>follow1</name><follower_num>2</follower_num></account>
<account><id>3</id><name>follow1</name><follower_num>3</follower_num></account>
</follow>
<follower>
<account><id>4</id><name>follower1</name><follower_num>4</follower_num></account>
<account><id>5</id><name>follower2</name><follower_num>5</follower_num></account>
<account><id>1</id><name>相互followさん</name><follower_num>1</follower_num></account>
</follower>
</my_users>

これを
・followしている人の名前を表示する
・followしている人の中でfollowerが二人以上いる人の名前
・相互followしている人の名前
でパースしたい時は、下記のようなコードになる。

import scala.xml.XML

object TestXMLParse{
def main(args:Array[String]) = {
//XML読み込む
val xml = XML.loadFile(args(0))

val my_follow = xml \ "follow"
val my_follower = xml \ "follower"

//-----followしている人の名前を表示する場合-----//
println("##########followしている人の名前を表示##########")
(my_follow \ "account").foreach(n => println((n \ "name").text))
//↓こっちでもOK
//my_follow.foreach(p => (p \ "account").foreach(n => println((n \ "name").text)))

//-----followしている人の中でfollowerが二人以上いる人の名前を表示-----//
println("##########followしている人の中でfollowerが二人以上いる人の名前を表示##########")
(my_follow \ "account").filter(n => (n \ "follower_num").text.toInt >= 2).foreach(s => println((s \ "name").text))

//-----相互followしている人の名前を表示-----//
println("##########相互followしている人の名前を表示##########")
val follower_ids = (my_follower \ "account").map(n => (n \ "id").text.toInt)
(my_follow \ "account").filter(p => follower_ids.find(_==(p \ "id").text.toInt).getOrElse(null)!=null).foreach(s => println((s \ "name").text))
}
}
TestXMLParse.main(Array("hoge.xml"))

ラクチン、ラクチン。簡単なパースなら標準のxmlパーサーで全然いけますね。


posted by purigen at 11:00| Comment(0) | TrackBack(0) | Scala | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。