htsn-import 0.1.0 → 0.1.1
raw patch · 13 files changed
+111/−41 lines, 13 files
Files
- doc/dbschema/AutoRacingResultsXML.png binary
- doc/dbschema/weatherxml.png binary
- htsn-import.cabal +1/−1
- schema/AutoRacingResultsXML.dtd +1/−1
- schemagen/AutoRacingResultsXML/21777587.xml +1/−0
- src/TSN/Parse.hs +5/−5
- src/TSN/Picklers.hs +6/−3
- src/TSN/XML/AutoRacingResults.hs +75/−19
- src/TSN/XML/Weather.hs +16/−8
- test/shell/import-duplicates.test +3/−3
- test/xml/AutoRacingResultsXML-no-most-laps-leading.xml +1/−0
- test/xml/AutoRacingResultsXML.dtd +1/−1
- test/xml/weatherxml-empty-weather.xml +1/−0
doc/dbschema/AutoRacingResultsXML.png view
binary file changed (156158 → 139652 bytes)
doc/dbschema/weatherxml.png view
binary file changed (93729 → 95637 bytes)
htsn-import.cabal view
@@ -1,5 +1,5 @@ name: htsn-import-version: 0.1.0+version: 0.1.1 cabal-version: >= 1.8 author: Michael Orlitzky maintainer: Michael Orlitzky <michael@orlitzky.com>
schema/AutoRacingResultsXML.dtd view
@@ -25,7 +25,7 @@ <!ELEMENT Laps (#PCDATA)> <!ELEMENT NumberOfLaps (#PCDATA)> <!ELEMENT Most_Laps_Leading ( DriverID, Driver, NumberOfLaps )>-<!ELEMENT Race_Information ( TrackLength, Laps, AverageSpeedMPH?, AverageSpeedKPH?, AverageSpeed?, TimeOfRace?, MarginOfVictory?, Cautions?, LeadChanges?, LapLeaders?, Most_Laps_Leading )>+<!ELEMENT Race_Information ( TrackLength, Laps, AverageSpeedMPH?, AverageSpeedKPH?, AverageSpeed?, TimeOfRace?, MarginOfVictory?, Cautions?, LeadChanges?, LapLeaders?, Most_Laps_Leading? )> <!ELEMENT time_stamp (#PCDATA)> <!ELEMENT message ( ( XML_File_ID, heading, category, sport, RaceID, RaceDate, Title, Track_Location, Laps_Remaining, Checkered_Flag, Listing*, Race_Information, time_stamp ) )> <!ELEMENT AverageSpeedMPH (#PCDATA)>
+ schemagen/AutoRacingResultsXML/21777587.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?> <!DOCTYPE message PUBLIC "-//TSN//DTD Leader 1.0/EN" "AutoRacingResultsXML.dtd"> <message> <XML_File_ID>21777587</XML_File_ID> <heading>ASX%BUSCH-FINAL-RESULTS</heading> <category>Statistics</category> <sport>NASCAR-B</sport> <RaceID>1731</RaceID> <RaceDate>9/13/2014 3:30:00 PM</RaceDate> <Title>NASCAR - Nationwide - Jimmy John's Freaky Fast 300 - Final Results</Title> <Track_Location>Chicagoland Speedway - Joliet, IL</Track_Location> <Laps_Remaining>0</Laps_Remaining> <Checkered_Flag>False</Checkered_Flag> <Race_Information> <TrackLength KPH="2.414">1.5</TrackLength> <Laps>200</Laps> </Race_Information> <time_stamp> September 13, 2014, at 03:36 PM ET </time_stamp> </message>
src/TSN/Parse.hs view
@@ -184,15 +184,15 @@ --- | The format string for a time_stamp. We keep the leading/trailing--- space so that parseTime and formatTime are inverses are one--- another, even though there is some confusion as to how these two--- functions should behave:+-- | The format string for a time_stamp. We have removed the+-- leading/trailing space so that parseTime and formatTime are NOT+-- inverses of one another. We should be able to rectify this once+-- everything is updated to support time-1.5. See, -- -- <https://ghc.haskell.org/trac/ghc/ticket/9150> -- time_stamp_format :: String-time_stamp_format = " %B %-d, %Y, at " ++ time_format ++ " ET "+time_stamp_format = "%B %-d, %Y, at " ++ time_format ++ " ET"
src/TSN/Picklers.hs view
@@ -270,8 +270,8 @@ -- -- >>> import Data.Maybe ( fromJust ) -- >>> :{--- let parse_date :: String -> Maybe UTCTime;--- parse_date = parseTime defaultTimeLocale date_format;+-- let parse_date :: String -> Maybe UTCTime+-- parse_date = parseTime defaultTimeLocale date_format -- :} -- -- >>> let dates = [ "1/" ++ (d : "/1970") | d <- ['1'..'9'] ]@@ -474,9 +474,12 @@ xp_time_stamp = (parse_time_stamp, from_time_stamp) `xpWrapMaybe` xpText where+ -- | We have to re-pad the time_stamp_format with a leading and+ -- trailing space; see the documentation of 'time_stamp_format'+ -- for more information. from_time_stamp :: UTCTime -> String from_time_stamp =- formatTime defaultTimeLocale time_stamp_format+ formatTime defaultTimeLocale (" " ++ time_stamp_format ++ " ")
src/TSN/XML/AutoRacingResults.hs view
@@ -46,6 +46,7 @@ xp11Tuple, xp13Tuple, xpAttr,+ xpDefault, xpElem, xpInt, xpList,@@ -259,17 +260,27 @@ -- the \"db_\" prefix since our field namer is going to strip of -- everything before the first underscore. --+-- We make the three fields optional because the entire+-- \<Most_Laps_Leading\> is apparently optional (although it is+-- usually present). A 'Nothing' in the XML should get turned into+-- three 'Nothing's in the DB.+-- data MostLapsLeading = MostLapsLeading {- db_most_laps_leading_driver_id :: Int,- db_most_laps_leading_driver :: String,- db_most_laps_leading_number_of_laps :: Int }+ db_most_laps_leading_driver_id :: Maybe Int,+ db_most_laps_leading_driver :: Maybe String,+ db_most_laps_leading_number_of_laps :: Maybe Int } deriving (Data, Eq, Show, Typeable) -- | Database representation of a \<Race_Information\> contained -- within a \<message\>. --+-- The 'db_most_laps_leading' field is not optional because when we+-- convert from our XML representation, a missing 'MostLapsLeading'+-- will be replaced with a 'MostLapsLeading' with three missing+-- fields.+-- data AutoRacingResultsRaceInformation = AutoRacingResultsRaceInformation { -- Note the apostrophe to disambiguate it from the@@ -306,7 +317,7 @@ xml_cautions :: Maybe String, xml_lead_changes :: Maybe String, xml_lap_leaders :: Maybe String,- xml_most_laps_leading :: MostLapsLeading }+ xml_most_laps_leading :: Maybe MostLapsLeading } deriving (Eq,Show) @@ -345,8 +356,15 @@ db_cautions = xml_cautions, db_lead_changes = xml_lead_changes, db_lap_leaders = xml_lap_leaders,- db_most_laps_leading = xml_most_laps_leading }-+ db_most_laps_leading = most_laps_leading }+ where+ -- If we didn't get a \<Most_Laps_Leading\>, indicate that in+ -- the database with an (embedded) 'MostLapsLeading' with three+ -- missing fields.+ most_laps_leading =+ case xml_most_laps_leading of+ Just mll -> mll+ Nothing -> MostLapsLeading Nothing Nothing Nothing -- | This allows us to insert the XML representation -- 'AutoRacingResultsRaceInformationXml' directly.@@ -507,24 +525,52 @@ -- | Pickler for the \<Most_Laps_Leading\> child of a--- \<Race_Information\>.+-- \<Race_Information\>. This is complicated by the fact that the+-- three fields we're trying to parse are not actually optional;+-- only the entire \<Most_Laps_Leading\> is. So we always wrap what+-- we parse in a 'Just', and when converting from the DB to XML,+-- we'll drop the entire element if any of its fields are missing+-- (which they never should be). ---pickle_most_laps_leading :: PU MostLapsLeading+pickle_most_laps_leading :: PU (Maybe MostLapsLeading) pickle_most_laps_leading = xpElem "Most_Laps_Leading" $ xpWrap (from_tuple, to_tuple) $- xpTriple (xpElem "DriverID" xpInt)- (xpElem "Driver" xpText)- (xpElem "NumberOfLaps" xpInt)+ xpTriple (xpOption $ xpElem "DriverID" xpInt)+ (xpOption $ xpElem "Driver" xpText)+ (xpOption $ xpElem "NumberOfLaps" xpInt) where- from_tuple = uncurryN MostLapsLeading- to_tuple m = (db_most_laps_leading_driver_id m,- db_most_laps_leading_driver m,- db_most_laps_leading_number_of_laps m)+ from_tuple :: (Maybe Int, Maybe String, Maybe Int) -> Maybe MostLapsLeading+ from_tuple (Just x, Just y, Just z) =+ Just $ MostLapsLeading (Just x) (Just y) (Just z)+ from_tuple _ = Nothing + -- Sure had to go out of my way to avoid the warnings about unused+ -- db_most_laps_foo fields here.+ to_tuple :: Maybe MostLapsLeading -> (Maybe Int, Maybe String, Maybe Int)+ to_tuple Nothing = (Nothing, Nothing, Nothing)+ to_tuple (Just (MostLapsLeading Nothing _ _)) = (Nothing, Nothing, Nothing)+ to_tuple (Just (MostLapsLeading _ Nothing _)) = (Nothing, Nothing, Nothing)+ to_tuple (Just (MostLapsLeading _ _ Nothing)) = (Nothing, Nothing, Nothing)+ to_tuple (Just m) = (db_most_laps_leading_driver_id m,+ db_most_laps_leading_driver m,+ db_most_laps_leading_number_of_laps m) + -- | Pickler for the \<Race_Information\> child of \<message\>. --+-- There's so much voodoo going on here. We have a double-layered+-- Maybe on top of the MostLapsLeading. When unpickling, we return a+-- Nothing (i.e. a Maybe MostLapsLeading) if any of its fields are+-- missing. But if the entire element is missing, unpickling+-- fails. 'xpOption' doesn't fix this because it would give us a+-- Maybe (Maybe MostLapsLeading). But we can use 'xpDefault' with a+-- default of (Nothing :: Maybe MostLapsLeading) to stick one in+-- there if unpicking a (Maybe MostLapsLeading) fails because+-- \<Most_Laps_Leading\> is missing.+--+-- Clear as mud, I know.+-- pickle_race_information :: PU AutoRacingResultsRaceInformationXml pickle_race_information = xpElem "Race_Information" $@@ -544,7 +590,7 @@ (xpOption $ xpElem "Cautions" xpText) (xpOption $ xpElem "LeadChanges" xpText) (xpOption $ xpElem "LapLeaders" xpText)- pickle_most_laps_leading+ (xpDefault Nothing pickle_most_laps_leading) where -- Derp. Since the first two are paired, we have to -- manually unpack the bazillion arguments.@@ -589,7 +635,10 @@ "test/xml/AutoRacingResultsXML.xml", check "pickle composed with unpickle is the identity (fractional KPH)"- "test/xml/AutoRacingResultsXML-fractional-kph.xml" ]+ "test/xml/AutoRacingResultsXML-fractional-kph.xml",++ check "pickle composed with unpickle is the identity (No Most_Laps_Leading)"+ "test/xml/AutoRacingResultsXML-no-most-laps-leading.xml"] where check desc path = testCase desc $ do (expected, actual) <- pickle_unpickle pickle_message path@@ -605,7 +654,10 @@ "test/xml/AutoRacingResultsXML.xml", check "unpickling succeeds (fractional KPH)"- "test/xml/AutoRacingResultsXML-fractional-kph.xml" ]+ "test/xml/AutoRacingResultsXML-fractional-kph.xml",++ check "unpickling succeeds (no Most_Laps_Leading)"+ "test/xml/AutoRacingResultsXML-no-most-laps-leading.xml" ] where check desc path = testCase desc $ do actual <- unpickleable path pickle_message@@ -623,7 +675,11 @@ "test/xml/AutoRacingResultsXML.xml", check "deleting auto_racing_results deletes its children (fractional KPH)"- "test/xml/AutoRacingResultsXML-fractional-kph.xml" ]+ "test/xml/AutoRacingResultsXML-fractional-kph.xml",++ check ("deleting auto_racing_results deletes its children " +++ "(No Most_Laps_Leading)")+ "test/xml/AutoRacingResultsXML-no-most-laps-leading.xml" ] where check desc path = testCase desc $ do results <- unsafe_unpickle path pickle_message
src/TSN/XML/Weather.hs view
@@ -101,7 +101,7 @@ data WeatherForecastListingXml = WeatherForecastListingXml { xml_teams :: String,- xml_weather :: String }+ xml_weather :: Maybe String } deriving (Eq, Show) @@ -114,7 +114,7 @@ db_weather_forecasts_id :: DefaultKey WeatherForecast, db_league_name :: Maybe String, db_teams :: String,- db_weather :: String }+ db_weather :: Maybe String } -- | We don't make 'WeatherForecastListingXml' an instance of@@ -247,7 +247,7 @@ db_away_team :: String, db_home_team :: String, db_weather_type :: Int,- db_description :: String,+ db_description :: Maybe String, db_temp_adjust :: Maybe String, db_temperature :: Int } @@ -263,7 +263,7 @@ xml_away_team :: String, xml_home_team :: String, xml_weather_type :: Int,- xml_description :: String,+ xml_description :: Maybe String, xml_temp_adjust :: Maybe String, xml_temperature :: Int } deriving (Eq, Show)@@ -506,8 +506,9 @@ xpWrap (from_pair, to_pair) $ xpPair (xpElem "teams" xpText)- (xpElem "weather" xpText)+ (xpElem "weather" (xpOption xpText)) where+-- from_pair (ts, Nothing) = WeatherForecastListingXml ts (Just "") from_pair = uncurry WeatherForecastListingXml to_pair WeatherForecastListingXml{..} = (xml_teams, xml_weather) @@ -554,7 +555,7 @@ (xpElem "AwayTeam" xpText) (xpElem "HomeTeam" xpText) (xpElem "WeatherType" xpInt)- (xpElem "Description" xpText)+ (xpElem "Description" (xpOption xpText)) (xpElem "TempAdjust" (xpOption xpText)) (xpElem "Temperature" xpInt) where@@ -660,7 +661,9 @@ [ check "unpickling succeeds" "test/xml/weatherxml.xml", check "unpickling succeeds (detailed)"- "test/xml/weatherxml-detailed.xml" ]+ "test/xml/weatherxml-detailed.xml",+ check "unpickling succeeds (empty weather)"+ "test/xml/weatherxml-empty-weather.xml"] where check desc path = testCase desc $ do actual <- unpickleable path pickle_message@@ -676,7 +679,9 @@ [ check "deleting weather deletes its children" "test/xml/weatherxml.xml", check "deleting weather deletes its children (detailed)"- "test/xml/weatherxml-detailed.xml" ]+ "test/xml/weatherxml-detailed.xml",+ check "deleting weather deletes its children (empty weather)"+ "test/xml/weatherxml-empty-weather.xml"] where check desc path = testCase desc $ do weather <- unsafe_unpickle path pickle_message@@ -712,6 +717,9 @@ True, check "test/xml/weatherxml-detailed.xml" "first type detected correctly (detailed)"+ True,+ check "test/xml/weatherxml-empty-weather.xml"+ "first type detected correctly (empty weather)" True, check "test/xml/weatherxml-type2.xml" "second type detected correctly"
test/shell/import-duplicates.test view
@@ -16,15 +16,15 @@ # and a newsxml that aren't really supposed to import. find ./test/xml -maxdepth 1 -name '*.xml' | wc -l >>>-30+32 >>>= 0 # Run the imports again; we should get complaints about the duplicate-# xml_file_ids. There are 2 errors for each violation, so we expect 2*26+# xml_file_ids. There are 2 errors for each violation, so we expect 2*28 # occurrences of the string 'ERROR'. ./dist/build/htsn-import/htsn-import -c 'shelltest.sqlite3' test/xml/*.xml 2>&1 | grep ERROR | wc -l >>>-52+56 >>>= 0 # Finally, clean up after ourselves.
+ test/xml/AutoRacingResultsXML-no-most-laps-leading.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?> <!DOCTYPE message PUBLIC "-//TSN//DTD Leader 1.0/EN" "AutoRacingResultsXML.dtd"> <message> <XML_File_ID>21777587</XML_File_ID> <heading>ASX%BUSCH-FINAL-RESULTS</heading> <category>Statistics</category> <sport>NASCAR-B</sport> <RaceID>1731</RaceID> <RaceDate>9/13/2014 3:30:00 PM</RaceDate> <Title>NASCAR - Nationwide - Jimmy John's Freaky Fast 300 - Final Results</Title> <Track_Location>Chicagoland Speedway - Joliet, IL</Track_Location> <Laps_Remaining>0</Laps_Remaining> <Checkered_Flag>False</Checkered_Flag> <Race_Information> <TrackLength KPH="2.414">1.5</TrackLength> <Laps>200</Laps> </Race_Information> <time_stamp> September 13, 2014, at 03:36 PM ET </time_stamp> </message>
test/xml/AutoRacingResultsXML.dtd view
@@ -25,7 +25,7 @@ <!ELEMENT Laps (#PCDATA)> <!ELEMENT NumberOfLaps (#PCDATA)> <!ELEMENT Most_Laps_Leading ( DriverID, Driver, NumberOfLaps )>-<!ELEMENT Race_Information ( TrackLength, Laps, AverageSpeedMPH?, AverageSpeedKPH?, AverageSpeed?, TimeOfRace?, MarginOfVictory?, Cautions?, LeadChanges?, LapLeaders?, Most_Laps_Leading )>+<!ELEMENT Race_Information ( TrackLength, Laps, AverageSpeedMPH?, AverageSpeedKPH?, AverageSpeed?, TimeOfRace?, MarginOfVictory?, Cautions?, LeadChanges?, LapLeaders?, Most_Laps_Leading? )> <!ELEMENT time_stamp (#PCDATA)> <!ELEMENT message ( ( XML_File_ID, heading, category, sport, RaceID, RaceDate, Title, Track_Location, Laps_Remaining, Checkered_Flag, Listing*, Race_Information, time_stamp ) )> <!ELEMENT AverageSpeedMPH (#PCDATA)>
+ test/xml/weatherxml-empty-weather.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?> <!DOCTYPE message PUBLIC "-//TSN//DTD Weather 1.0/EN" "weatherxml.dtd"> <message> <XML_File_ID>21812233</XML_File_ID> <heading>AAW%BBWEATHER</heading> <category>Weather</category> <sport>MLB</sport> <title>Major League Baseball Weather from The Sports Network</title> <forecast gamedate="Thursday, September 18th"> <league name="National League"> <listing> <teams>Washington Nationals at Miami Marlins, 7:10 p.m.</teams> <weather>Partly cloudy with a 60-percent chance of rain. Winds blowing in from right field at 5-10 m.p.h. Game-time temperature: Around 80.</weather> </listing> <listing> <teams>Los Angeles Dodgers at Chicago Cubs, 8:05 p.m.</teams> <weather>Clear. Winds blowing in from center field at 5-10 m.p.h. Game-time temperature: Around 60.</weather> </listing> <listing> <teams>Milwaukee Brewers at St. Louis Cardinals, 8:15 p.m.</teams> <weather>Clear. Winds blowing in from center field at 5-10 m.p.h. Game-time temperature: Around 70.</weather> </listing> <listing> <teams>Arizona Diamondbacks at Colorado Rockies, 8:40 p.m.</teams> <weather>Clear. Winds blowing out to left field at 10-15 m.p.h. Game-time temperature: Around 85.</weather> </listing> <listing> <teams>Philadelphia Phillies at San Diego Padres, 9:10 p.m.</teams> <weather>Partly cloudy. Winds blowing in from left field at 10-15 m.p.h. Game-time temperature: Around 75.</weather> </listing> </league> <league name="Interleague"> <listing> <teams>Boston Red Sox at Pittsburgh Pirates, 7:05 p.m.</teams> <weather>Partly cloudy. Winds blowing out to right field at 5-10 m.p.h. Game-time temperature: Around 65.</weather> </listing> </league> <league name="American League"> <listing> <teams>Texas Rangers at Oakland Athletics, 3:35 p.m.</teams> <weather>Cloudy with a 40-percent chance of rain. Winds blowing out to center field at 5-10 m.p.h. Game-time temperature: Around 70.</weather> </listing> <listing> <teams>Toronto Blue Jays at New York Yankees, 7:05 p.m.</teams> <weather>Partly cloudy. Winds blowing out to right field at 5-10 m.p.h. Game-time temperature: Around 70.</weather> </listing> <listing> <teams>Cleveland Indians at Houston Astros, 8:10 p.m.</teams> <weather>Partly cloudy with a 70-percent chance of rain. Winds blowing out to left field at 5-10 m.p.h. Game-time temperature: Around 80.</weather> </listing> <listing> <teams>Seattle Mariners at LA Angels of Anaheim, 10:05 p.m.</teams> <weather>Clear. Winds blowing out to left field at 5-10 m.p.h. Game-time temperature: Around 80.</weather> </listing> </league> </forecast> <forecast gamedate="Monday, September 22nd"> <league name=""> <listing> <teams>Cleveland Indians at Kansas City Royals, 6:05 p.m.</teams> <weather></weather> </listing> </league> </forecast> <Detailed_Weather> <DW_Listing SportCode="AA" Sport="MLB"> <Item> <Sportcode>AA</Sportcode> <GameID>41428</GameID> <Gamedate>9/18/2014 7:10:00 PM</Gamedate> <AwayTeam>Washington Nationals</AwayTeam> <HomeTeam>Miami Marlins</HomeTeam> <WeatherType>2</WeatherType> <Description>Partly cloudy with a 60-percent chance of rain. Winds blowing in from right field at 5-10 m.p.h.</Description> <TempAdjust>Around</TempAdjust> <Temperature>80</Temperature> </Item> <Item> <Sportcode>AA</Sportcode> <GameID>41430</GameID> <Gamedate>9/18/2014 8:05:00 PM</Gamedate> <AwayTeam>Los Angeles Dodgers</AwayTeam> <HomeTeam>Chicago Cubs</HomeTeam> <WeatherType>10</WeatherType> <Description>Clear. Winds blowing in from center field at 5-10 m.p.h.</Description> <TempAdjust>Around</TempAdjust> <Temperature>60</Temperature> </Item> <Item> <Sportcode>AA</Sportcode> <GameID>41431</GameID> <Gamedate>9/18/2014 8:15:00 PM</Gamedate> <AwayTeam>Milwaukee Brewers</AwayTeam> <HomeTeam>St. Louis Cardinals</HomeTeam> <WeatherType>10</WeatherType> <Description>Clear. Winds blowing in from center field at 5-10 m.p.h.</Description> <TempAdjust>Around</TempAdjust> <Temperature>70</Temperature> </Item> <Item> <Sportcode>AA</Sportcode> <GameID>41433</GameID> <Gamedate>9/18/2014 8:40:00 PM</Gamedate> <AwayTeam>Arizona Diamondbacks</AwayTeam> <HomeTeam>Colorado Rockies</HomeTeam> <WeatherType>10</WeatherType> <Description>Clear. Winds blowing out to left field at 10-15 m.p.h.</Description> <TempAdjust>Around</TempAdjust> <Temperature>85</Temperature> </Item> <Item> <Sportcode>AA</Sportcode> <GameID>41432</GameID> <Gamedate>9/18/2014 9:10:00 PM</Gamedate> <AwayTeam>Philadelphia Phillies</AwayTeam> <HomeTeam>San Diego Padres</HomeTeam> <WeatherType>2</WeatherType> <Description>Partly cloudy. Winds blowing in from left field at 10-15 m.p.h.</Description> <TempAdjust>Around</TempAdjust> <Temperature>75</Temperature> </Item> <Item> <Sportcode>AA</Sportcode> <GameID>41429</GameID> <Gamedate>9/18/2014 7:05:00 PM</Gamedate> <AwayTeam>Boston Red Sox</AwayTeam> <HomeTeam>Pittsburgh Pirates</HomeTeam> <WeatherType>2</WeatherType> <Description>Partly cloudy. Winds blowing out to right field at 5-10 m.p.h.</Description> <TempAdjust>Around</TempAdjust> <Temperature>65</Temperature> </Item> <Item> <Sportcode>AA</Sportcode> <GameID>41426</GameID> <Gamedate>9/18/2014 3:35:00 PM</Gamedate> <AwayTeam>Texas Rangers</AwayTeam> <HomeTeam>Oakland Athletics</HomeTeam> <WeatherType>3</WeatherType> <Description>Cloudy with a 40-percent chance of rain. Winds blowing out to center field at 5-10 m.p.h.</Description> <TempAdjust>Around</TempAdjust> <Temperature>70</Temperature> </Item> <Item> <Sportcode>AA</Sportcode> <GameID>41424</GameID> <Gamedate>9/18/2014 7:05:00 PM</Gamedate> <AwayTeam>Toronto Blue Jays</AwayTeam> <HomeTeam>New York Yankees</HomeTeam> <WeatherType>2</WeatherType> <Description>Partly cloudy. Winds blowing out to right field at 5-10 m.p.h.</Description> <TempAdjust>Around</TempAdjust> <Temperature>70</Temperature> </Item> <Item> <Sportcode>AA</Sportcode> <GameID>41425</GameID> <Gamedate>9/18/2014 8:10:00 PM</Gamedate> <AwayTeam>Cleveland Indians</AwayTeam> <HomeTeam>Houston Astros</HomeTeam> <WeatherType>2</WeatherType> <Description>Partly cloudy with a 70-percent chance of rain. Winds blowing out to left field at 5-10 m.p.h.</Description> <TempAdjust>Around</TempAdjust> <Temperature>80</Temperature> </Item> <Item> <Sportcode>AA</Sportcode> <GameID>41427</GameID> <Gamedate>9/18/2014 10:05:00 PM</Gamedate> <AwayTeam>Seattle Mariners</AwayTeam> <HomeTeam>LA Angels of Anaheim</HomeTeam> <WeatherType>10</WeatherType> <Description>Clear. Winds blowing out to left field at 5-10 m.p.h.</Description> <TempAdjust>Around</TempAdjust> <Temperature>80</Temperature> </Item> <Item> <Sportcode>AA</Sportcode> <GameID>41180</GameID> <Gamedate>9/22/2014 6:05:00 PM</Gamedate> <AwayTeam>Cleveland Indians</AwayTeam> <HomeTeam>Kansas City Royals</HomeTeam> <WeatherType>11</WeatherType> <Description></Description> <TempAdjust></TempAdjust> <Temperature>0</Temperature> </Item> </DW_Listing> <DW_Listing SportCode="AB" Sport="NFL"> <Item> <Sportcode>AB</Sportcode> <GameID>4631</GameID> <Gamedate>9/18/2014 8:25:00 PM</Gamedate> <AwayTeam>Tampa Bay Buccaneers</AwayTeam> <HomeTeam>Atlanta Falcons</HomeTeam> <WeatherType>11</WeatherType> <Description>Game is being played inside a dome.</Description> <TempAdjust></TempAdjust> <Temperature>0</Temperature> </Item> </DW_Listing> <DW_Listing SportCode="AJ" Sport="CFL"> <Item> <Sportcode>AJ</Sportcode> <GameID>1247</GameID> <Gamedate>9/19/2014 10:00:00 PM</Gamedate> <AwayTeam>Toronto Argonauts</AwayTeam> <HomeTeam>British Columbia Lions</HomeTeam> <WeatherType>2</WeatherType> <Description>Partly cloudy. Winds southeast at 5-10 m.p.h.</Description> <TempAdjust>Near</TempAdjust> <Temperature>65</Temperature> </Item> </DW_Listing> <DW_Listing SportCode="AF" Sport="CFOOT"> <Item> <Sportcode>AF</Sportcode> <GameID>42695</GameID> <Gamedate>9/18/2014 7:30:00 PM</Gamedate> <AwayTeam>Auburn</AwayTeam> <HomeTeam>Kansas State</HomeTeam> <WeatherType>2</WeatherType> <Description>Partly cloudy. Winds southeast at 10-15 m.p.h.</Description> <TempAdjust>Around</TempAdjust> <Temperature>75</Temperature> </Item> <Item> <Sportcode>AF</Sportcode> <GameID>44032</GameID> <Gamedate>9/19/2014 8:00:00 PM</Gamedate> <AwayTeam>Connecticut</AwayTeam> <HomeTeam>So Florida</HomeTeam> <WeatherType>2</WeatherType> <Description>Partly cloudy with a 50-percent chance of rain. Winds northeast at 5-10 m.p.h.</Description> <TempAdjust>Around</TempAdjust> <Temperature>80</Temperature> </Item> </DW_Listing> </Detailed_Weather> <time_stamp> September 18, 2014, at 09:19 AM ET </time_stamp> </message>