in src/main/scala/pa/Parser.scala [349:491]
def parseTeamEventMatches(s: String): List[TeamEventMatch] = {
def parseMatchTeam(team: NodeSeq): TeamEventMatchTeam = {
TeamEventMatchTeam(
id = team \@ "teamID",
name = team \> "name",
score = (team \> "score").toInt,
htScore = (team \> "htScore").toInt,
aggregateScore = (team \>> "aggregateScore").map(_.toInt)
)
}
def parseTeamEventMatchEvents(events: NodeSeq): TeamEventMatchEvents = {
TeamEventMatchEvents(
bookings = (events \ "bookings" \ "booking") map { node =>
TeamEventMatchBooking(
eventId = node \@ "eventID",
normalTime = node \> "normalTime",
addedTime = node \> "addedTime",
team = Team(node \ "team" \@ "teamID", node \> "team"),
player = {
val playerNode = node \ "player"
Player(playerNode \@ "playerID", node \ "team" \@ "teamID", playerNode.text)
},
reason = node \> "reason"
)
},
dismissals = (events \ "dismissals" \ "dismissal") map { node =>
TeamEventMatchDismissal(
eventId = node \@ "eventID",
normalTime = node \> "normalTime",
addedTime = node \> "addedTime",
team = Team(node \ "team" \@ "teamID", node \> "team"),
player = {
val playerNode = node \ "player"
Player(playerNode \@ "playerID", node \ "team" \@ "teamID", playerNode.text)
},
reason = node \> "reason"
)
},
goals = (events \ "goals" \ "goal") map { node =>
TeamEventMatchGoal(
eventId = node \@ "eventID",
normalTime = node \> "normalTime",
addedTime = node \> "addedTime",
team = Team(node \ "team" \@ "teamID", node \> "team"),
player = {
val playerNode = node \ "player"
Player(playerNode \@ "playerID", node \ "team" \@ "teamID", playerNode.text)
},
ownGoal = (node \> "ownGoal") == "Yes",
how = node \>> "how",
whereFrom = node \>> "whereFrom",
whereTo = node \>> "whereTo",
distanceInYards = node \>> "distanceInYards"
)
},
penalties = (events \ "penalties" \ "penalty") map { node =>
TeamEventMatchPenalty(
eventId = node \@ "eventID",
normalTime = node \> "normalTime",
addedTime = node \> "addedTime",
team = Team(node \ "team" \@ "teamID", node \> "team"),
player = {
val playerNode = node \ "player"
Player(playerNode \@ "playerID", node \ "team" \@ "teamID", playerNode.text)
},
how = node \>> "how",
whereTo = node \>> "whereTo",
outcome = node \> "outcome",
keeperCorrect = (node \>> "keeperCorrect") map ("Yes"==),
`type` = node \>> "type"
)
},
substitutions = (events \ "substitutions" \ "substitution") map { node =>
TeamEventMatchSubstitution(
eventId = node \@ "eventID",
normalTime = node \> "normalTime",
addedTime = node \> "addedTime",
team = Team(node \ "team" \@ "teamID", node \> "team"),
playerOn = {
val playerNode = node \ "playerOn"
Player(playerNode \@ "playerID", node \ "team" \@ "teamID", playerNode.text)
},
playerOff = {
val playerNode = node \ "playerOff"
Player(playerNode \@ "playerID", node \ "team" \@ "teamID", playerNode.text)
},
how = node \>> "how",
reason = node \>> "reason"
)
},
shootoutPenalties = (events \ "shootOutPenalties" \ "shootOutPenalty") map { node =>
TeamEventMatchShootoutPenalty(
eventId = node \@ "eventID",
team = Team(node \ "team" \@ "teamID", node \> "team"),
player = {
val playerNode = node \ "player"
Player(playerNode \@ "playerID", node \ "team" \@ "teamID", playerNode.text)
},
how = node \>> "how",
`type` = node \>> "type",
whereTo = node \>> "whereTo",
keeperCorrect = (node \>> "keeperCorrect") map ("Yes"==),
outcome = node \>> "outcome"
)
},
other = (events \ "other" \ "event") map { node =>
TeamEventMatchOther(
eventId = node \@ "eventID",
normalTime = node \> "normalTime",
addedTime = node \> "addedTime",
team = Team(node \ "team1" \@ "teamID", node \> "team1"),
player = (node \>> "player1").map { playerName =>
Player(node \ "player1" \@ "playerID", node \ "team1" \@ "teamID", playerName)
},
eventType = node \> "eventType",
how = node \>> "how",
`type` = node \>> "type",
whereFrom = node \>> "whereFrom",
whereTo = node \>> "whereTo",
distanceInYards = (node \>> "distanceInYards").map(_.toInt),
outcome = node \>> "outcome",
onTarget = (node \>> "onTarget") map ("Yes"==)
)
}
)
}
(XML.loadString(s) \\ "matches" \ "match") map { matchNode =>
val homeTeam = parseMatchTeam(matchNode \ "homeTeam")
val awayTeam = parseMatchTeam(matchNode \ "awayTeam")
TeamEventMatch(
id = matchNode \@ "matchID",
date = Date(matchNode \@ "date", matchNode \@ "koTime"),
competitionId = matchNode \ "competition" \@ "competitionID",
stage = (matchNode \ "stage" \@ "stageNumber").toInt,
round = (matchNode \ "round" \@ "roundNumber").toInt,
leg = (matchNode \> "leg").toInt,
homeTeam = homeTeam,
awayTeam = awayTeam,
events = parseTeamEventMatchEvents(matchNode \ "events")
)
}
}