アプリ版:「スタンプのみでお礼する」機能のリリースについて

ScalaでXMLファイルから次のようなXPath式で表されるのノードを選択したくてサンプルプログラムを作ってみました.

XPath式:"/musicLibrary/cd[string(year) = '1994']/title"

[サンプルプログラム]

import scala.xml.XML
import scala.xml.Node
import scala.xml.Elem

object Main {

def main(args: Array[String]): Unit = {
val root:Elem = XML.loadFile("MusicLibrary.xml")
val cds =
((root \\ "musicLibrary" \ "cd")
.filter(p => p.asInstanceOf[Elem].child
.filter(child => isElem(child) &&(child.asInstanceOf[Elem].label == "year"))
.exists(year => year.text == "1994")))
val titles = cds \ "title"
titles.foreach(title => println("The title='" + title.text + "'"))
}

def isElem(node:Node) ={
node match{
case e:Elem => true
case _ => false
}
}
}

このプログラムで入力XMLファイル(MusicLibrary.xml)の以下が部分が選択され、

<?xml version="1.0" encoding="utf-8"?>
<musicLibrary>
...
<cd id="4">
<title>The Dark Side of the Moon</title>
<year>1994</year>
<artist>Pink Floyd</artist>
<genre>Rock</genre>
</cd>
...
</musicLibrary>

一応

The title='The Dark Side of the Moon'

とコンソール表示されます.

しかし、まったくの初心者のプログラムのため
val cds = 以下とval titles=以下は非常に冗長に感じられます.

もっとシンプルに目的のノードを選択できるコーディングがありましたらご教授ください.

以上 よろしくお願いいたします.

A 回答 (1件)

import scala.xml.XML



object Main {
def main(args: Array[String]) {
val root = XML.loadFile("MusicLibrary.xml")
for {
cds <- root \\ "musicLibrary" \ "cd"
if (cds \ "year").text == "1994"
titles <- cds \ "title"
title <- titles
} println("The title='" + title.text + "'")
}
}

私も Scala で XML を触ったことはないのであまり知りませんが、こんな感じじゃないでしょうか。
私の環境では正しく動いているように思えますが、バグっていたらすみません。
    • good
    • 0
この回答へのお礼

バッチリ動きました.
自分のコードが冗長なのがよくわかりました.

勉強になります.どうもありがとうございました!!!

お礼日時:2013/09/01 19:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!