def fromXML(xml): game = Game() # exhibition games not supported if Util.XPathSelectOne(xml, "./@game_type") == "E": return game.home_team = TeamList.findById(Util.XPathSelectOne(xml,"./@home_team_id")) game.away_team = TeamList.findById(Util.XPathSelectOne(xml,"./@away_team_id")) game.event_id = Util.XPathSelectOne(xml,"game_media/media/@calendar_event_id") game.time = Util.XPathSelectOne(xml, "./@time") + ("AM" if Util.XPathSelectOne(xml, "./@ampm").upper() == "AM" else "PM") + " " + Util.XPathSelectOne(xml, "./@time_zone") game.status.update({ "indicator": Util.XPathSelectOne(xml,"status/@ind"), "label": Util.XPathSelectOne(xml,"status/@status"), "reason": Util.XPathSelectOne(xml,"status/@reason"), "inning": Util.XPathSelectOne(xml,"status/@inning"), "half": ("top" if Util.XPathSelectOne(xml,"status/@top_inning") == "Y" else "bot") }) on_base = Util.XPathSelectOne(xml, "runners_on_base/@status") or 0 game.situation.update({ # on base status is a bitfield. count how many of the first 3 bits are set. "baserunners": sum([((int(on_base) & 7) >> bit) & 1 for bit in range(3)]), "outs": Util.XPathSelectOne(xml,"./@o") }) for inning in xml.xpath('linescore/inning'): game.home_line["innings"] += (Util.XPathSelectOne(inning, "./@home") or "") game.away_line["innings"] += (Util.XPathSelectOne(inning, "./@away") or "") for stat in ["runs", "hits", "errors"]: game.home_line[stat] = Util.XPathSelectOne(xml,"linescore/" + stat[0] + "/@home") game.away_line[stat] = Util.XPathSelectOne(xml,"linescore/" + stat[0] + "/@away") for player, stats in [ ["home_probable_pitcher", ["era", "wins", "losses"]], ["away_probable_pitcher", ["era", "wins", "losses"]], ["batter", ["h", "ab", "avg", "rbi", "hr"]], ["pitcher", ["ip", "er", "wins", "losses", "era"]], ["winning_pitcher", ["era", "wins", "losses"]], ["losing_pitcher", ["era", "wins", "losses"]], ["save_pitcher", ["era", "wins", "losses", "saves"]] ]: if Util.XPathSelectOne(xml, player + '/@id'): game.players[player] = { "name": Util.XPathSelectOne(xml, player + '/@first') + " " + Util.XPathSelectOne(xml, player + '/@last') } for stat in stats: game.players[player][stat] = Util.XPathSelectOne(xml, player + '/@' + stat) return game
def fromXML(xml): game = Game() # exhibition games not supported if Util.XPathSelectOne(xml, "./@game_type") == "E": return game.home_team = TeamList.findById( Util.XPathSelectOne(xml, "./@home_team_id")) game.away_team = TeamList.findById( Util.XPathSelectOne(xml, "./@away_team_id")) game.event_id = Util.XPathSelectOne(xml, "game_media/media/@calendar_event_id") game.time = Util.XPathSelectOne(xml, "./@time") + ( "AM" if Util.XPathSelectOne(xml, "./@ampm").upper() == "AM" else "PM") + " " + Util.XPathSelectOne(xml, "./@time_zone") game.status.update({ "indicator": Util.XPathSelectOne(xml, "status/@ind"), "label": Util.XPathSelectOne(xml, "status/@status"), "reason": Util.XPathSelectOne(xml, "status/@reason"), "inning": Util.XPathSelectOne(xml, "status/@inning"), "half": ("top" if Util.XPathSelectOne(xml, "status/@top_inning") == "Y" else "bot") }) on_base = Util.XPathSelectOne(xml, "runners_on_base/@status") or 0 game.situation.update({ # on base status is a bitfield. count how many of the first 3 bits are set. "baserunners": sum([((int(on_base) & 7) >> bit) & 1 for bit in range(3)]), "outs": Util.XPathSelectOne(xml, "./@o") }) for inning in xml.xpath('linescore/inning'): game.home_line["innings"] += (Util.XPathSelectOne(inning, "./@home") or "") game.away_line["innings"] += (Util.XPathSelectOne(inning, "./@away") or "") for stat in ["runs", "hits", "errors"]: game.home_line[stat] = Util.XPathSelectOne( xml, "linescore/" + stat[0] + "/@home") game.away_line[stat] = Util.XPathSelectOne( xml, "linescore/" + stat[0] + "/@away") for player, stats in [["home_probable_pitcher", ["era", "wins", "losses"]], ["away_probable_pitcher", ["era", "wins", "losses"]], ["batter", ["h", "ab", "avg", "rbi", "hr"]], ["pitcher", ["ip", "er", "wins", "losses", "era"]], ["winning_pitcher", ["era", "wins", "losses"]], ["losing_pitcher", ["era", "wins", "losses"]], ["save_pitcher", ["era", "wins", "losses", "saves"]]]: if Util.XPathSelectOne(xml, player + '/@id'): game.players[player] = { "name": Util.XPathSelectOne(xml, player + '/@first') + " " + Util.XPathSelectOne(xml, player + '/@last') } for stat in stats: game.players[player][stat] = Util.XPathSelectOne( xml, player + '/@' + stat) return game