htsn-import 0.0.2 → 0.0.4
raw patch · 31 files changed
+1448/−39 lines, 31 filesdep ~tastydep ~tasty-hunitbinary-added
Dependency ranges changed: tasty, tasty-hunit
Files
- doc/TODO +12/−0
- doc/dbschema/Auto_Racing_Schedule_XML.png binary
- doc/dbschema/scoresxml.png binary
- doc/htsn-importrc.example +3/−2
- doc/man1/htsn-import.1 +10/−5
- htsn-import.cabal +11/−7
- makefile +1/−1
- schema/Auto_Racing_Schedule_XML.dtd +26/−0
- schema/scoresxml.dtd +27/−0
- schemagen/Auto_Racing_Schedule_XML/20136714.xml +1/−0
- schemagen/scoresxml/20160114.xml +1/−0
- schemagen/scoresxml/20160285.xml +1/−0
- schemagen/scoresxml/20187479.xml +1/−0
- src/Main.hs +31/−17
- src/TSN/Picklers.hs +18/−0
- src/TSN/XML/AutoRacingSchedule.hs +565/−0
- src/TSN/XML/Heartbeat.hs +6/−0
- src/TSN/XML/Injuries.hs +7/−0
- src/TSN/XML/InjuriesDetail.hs +8/−0
- src/TSN/XML/News.hs +7/−1
- src/TSN/XML/Odds.hs +9/−2
- src/TSN/XML/Scores.hs +630/−0
- src/TSN/XML/Weather.hs +8/−0
- test/TestSuite.hs +5/−1
- test/shell/import-duplicates.test +3/−3
- test/xml/Auto_Racing_Schedule_XML-miles-track-length.xml +1/−0
- test/xml/Auto_Racing_Schedule_XML.dtd +26/−0
- test/xml/Auto_Racing_Schedule_XML.xml +1/−0
- test/xml/scoresxml-no-locations.xml +1/−0
- test/xml/scoresxml.dtd +27/−0
- test/xml/scoresxml.xml +1/−0
doc/TODO view
@@ -5,3 +5,15 @@ longer takes 10 minutes to import (Postgres only?). 3. Add support the the second type of weatherxml (see man page).++4. There are a few remaining document types that we need to parse+ before "version one point oh." This list refers to an+ old proprietary implementation, sorry:++ * AutoRaceResultsXML+ * jfilexml+ * Schedule_Changes_XML+ * GameInfoXML+ * SportInfoListing++5. Try mass import of Auto_Racing_Schedule_XML.
+ doc/dbschema/Auto_Racing_Schedule_XML.png view
binary file changed (absent → 102970 bytes)
+ doc/dbschema/scoresxml.png view
binary file changed (absent → 130738 bytes)
doc/htsn-importrc.example view
@@ -41,9 +41,10 @@ # How verbose should the logs be? Valid levels are, #-# "INFO", "WARNING", "ERROR"+# "DEBUG", "INFO", "WARNING", "ERROR" #-# (there are others, but we don't emit them.)+# (there are others, but we don't emit them.) The debug output is+# extremely verbose and will not be written to syslog even if you try. # # Default: "INFO" #
doc/man1/htsn-import.1 view
@@ -48,16 +48,20 @@ The XML document types obtained from the feed are uniquely identified by their DTDs. We currently support documents with the following DTDs: .IP \[bu] 2-Heartbeat.dtd+Auto_Racing_Schedule_XML.dtd .IP \[bu]-newsxml.dtd+Heartbeat.dtd .IP \[bu] Injuries_Detail_XML.dtd .IP \[bu] injuriesxml.dtd .IP \[bu]+newsxml.dtd+.IP \[bu] Odds_XML.dtd .IP \[bu]+scoresxml.dtd+.IP \[bu] weatherxml.dtd .SH DATABASE SCHEMA@@ -152,10 +156,11 @@ Default: none .IP \fB\-\-log-level\fR-How verbose should the logs be? We log notifications at three levels:-INFO, WARN, and ERROR. Specify the \(dqmost boring\(dq level of+How verbose should the logs be? We log notifications at four levels:+DEBUG, INFO, WARN, and ERROR. Specify the \(dqmost boring\(dq level of notifications you would like to receive (in all-caps); more-interesting notifications will be logged as well.+interesting notifications will be logged as well. The debug output is+extremely verbose and will not be written to syslog even if you try. Default: INFO
htsn-import.cabal view
@@ -1,5 +1,5 @@ name: htsn-import-version: 0.0.2+version: 0.0.4 cabal-version: >= 1.8 author: Michael Orlitzky maintainer: Michael Orlitzky <michael@orlitzky.com>@@ -16,11 +16,13 @@ doc/TODO makefile schema/*.dtd+ schemagen/Auto_Racing_Schedule_XML/*.xml schemagen/Heartbeat/*.xml schemagen/injuriesxml/*.xml schemagen/Injuries_Detail_XML/*.xml schemagen/newsxml/*.xml schemagen/Odds_XML/*.xml+ schemagen/scoresxml/*.xml schemagen/weatherxml/*.xml test/shell/*.test test/xml/*.xml@@ -85,8 +87,8 @@ groundhog-th == 0.4.*, MissingH == 1.2.*, old-locale == 1.0.*,- tasty == 0.7.*,- tasty-hunit == 0.4.*,+ tasty == 0.8.*,+ tasty-hunit == 0.8.*, time == 1.4.*, transformers == 0.3.*, tuple == 0.2.*@@ -109,11 +111,13 @@ TSN.DbImport TSN.Picklers TSN.XmlImport+ TSN.XML.AutoRacingSchedule TSN.XML.Heartbeat TSN.XML.Injuries TSN.XML.InjuriesDetail TSN.XML.News TSN.XML.Odds+ TSN.XML.Scores TSN.XML.Weather Xml @@ -160,8 +164,8 @@ groundhog-th == 0.4.*, MissingH == 1.2.*, old-locale == 1.0.*,- tasty == 0.7.*,- tasty-hunit == 0.4.*,+ tasty == 0.8.*,+ tasty-hunit == 0.8.*, time == 1.4.*, transformers == 0.3.*, tuple == 0.2.*@@ -232,8 +236,8 @@ MissingH == 1.2.*, old-locale == 1.0.*, process == 1.1.*,- tasty == 0.7.*,- tasty-hunit == 0.4.*,+ tasty == 0.8.*,+ tasty-hunit == 0.8.*, time == 1.4.*, transformers == 0.3.*, tuple == 0.2.*
makefile view
@@ -43,7 +43,7 @@ # dist: runghc Setup.hs configure --prefix=/- runghc Setup.hs sdist+ TAR_OPTIONS="--format=ustar" runghc Setup.hs sdist hlint: hlint --ignore="Use camelCase" \
+ schema/Auto_Racing_Schedule_XML.dtd view
@@ -0,0 +1,26 @@+<!ELEMENT XML_File_ID (#PCDATA)>+<!ELEMENT heading (#PCDATA)>+<!ELEMENT category (#PCDATA)>+<!ELEMENT sport (#PCDATA)>+<!ELEMENT Title (#PCDATA)>+<!ELEMENT Complete_Through (#PCDATA)>+<!ELEMENT RaceID (#PCDATA)>+<!ELEMENT Race_Date (#PCDATA)>+<!ELEMENT Race_Time (#PCDATA)>+<!ELEMENT RaceName (#PCDATA)>+<!ELEMENT TrackName (#PCDATA)>+<!ELEMENT Location (#PCDATA)>+<!ELEMENT TV_Listing (#PCDATA)>+<!ELEMENT Laps (#PCDATA)>+<!ELEMENT TrackLength (#PCDATA)>+<!ELEMENT FinishPosition (#PCDATA)>+<!ELEMENT DriverID (#PCDATA)>+<!ELEMENT Name (#PCDATA)>+<!ELEMENT LeadingLaps (#PCDATA)>+<!ELEMENT Earnings (#PCDATA)>+<!ELEMENT Status (#PCDATA)>+<!ELEMENT RaceResultsListing ( ( FinishPosition, DriverID, Name, LeadingLaps, Laps, Earnings, Status ) )>+<!ELEMENT RaceResults ( RaceResultsListing* )>+<!ELEMENT Listing ( ( RaceID, Race_Date, Race_Time, RaceName, TrackName, Location, TV_Listing, Laps, TrackLength, RaceResults ) )>+<!ELEMENT time_stamp (#PCDATA)>+<!ELEMENT message ( ( XML_File_ID, heading, category, sport, Title, Complete_Through, Listing*, time_stamp ) )>
+ schema/scoresxml.dtd view
@@ -0,0 +1,27 @@+<!ELEMENT XML_File_ID (#PCDATA)>+<!ELEMENT heading (#PCDATA)>+<!ELEMENT game_id (#PCDATA)>+<!ELEMENT schedule_id (#PCDATA)>+<!ELEMENT tsnupdate (#PCDATA)>+<!ELEMENT category (#PCDATA)>+<!ELEMENT sport (#PCDATA)>+<!ELEMENT seasontype (#PCDATA)>+<!ELEMENT vteam (#PCDATA)>+<!ELEMENT hteam (#PCDATA)>+<!ELEMENT vscore (#PCDATA)>+<!ELEMENT hscore (#PCDATA)>+<!ELEMENT time_r (#PCDATA)>+<!ELEMENT status (#PCDATA)>+<!ELEMENT game ( ( vteam, hteam, vscore, hscore, time_r?, status, notes? ) )>+<!ELEMENT time_stamp (#PCDATA)>+<!ELEMENT message ( ( XML_File_ID, heading, game_id, schedule_id, tsnupdate?, category, sport, location*, seasontype, game, time_stamp ) )>+<!ELEMENT city (#PCDATA)>+<!ELEMENT state (#PCDATA)>+<!ELEMENT country (#PCDATA)>+<!ELEMENT location ( ( city, state, country ) )>+<!ELEMENT notes (#PCDATA)>++<!ATTLIST vteam id CDATA #REQUIRED>+<!ATTLIST hteam id CDATA #REQUIRED>+<!ATTLIST status numeral CDATA #REQUIRED>+<!ATTLIST status type CDATA #REQUIRED>
+ schemagen/Auto_Racing_Schedule_XML/20136714.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?> <!DOCTYPE message PUBLIC "-//TSN//DTD Leader 1.0/EN" "Auto_Racing_Schedule_XML.dtd"> <message> <XML_File_ID>20136714</XML_File_ID> <heading>BFX%SCHEDULE</heading> <category>Statistics</category> <sport>NASCAR</sport> <Title>2013 NASCAR Sprint Cup Schedule</Title> <Complete_Through>Complete through </Complete_Through> <Listing> <RaceID>1492</RaceID> <Race_Date>02/16/2013</Race_Date> <Race_Time>08:10 PM</Race_Time> <RaceName>Sprint Unlimited at Daytona</RaceName> <TrackName>Daytona International Speedway</TrackName> <Location>Daytona Beach, FL</Location> <TV_Listing>FOX</TV_Listing> <Laps>75</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>40</LeadingLaps> <Laps>75</Laps> <Earnings>205,075</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>49</DriverID> <Name>Greg Biffle</Name> <LeadingLaps>2</LeadingLaps> <Laps>75</Laps> <Earnings>101,325</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>0</LeadingLaps> <Laps>75</Laps> <Earnings>61,325</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>43</DriverID> <Name>Tony Stewart</Name> <LeadingLaps>5</LeadingLaps> <Laps>75</Laps> <Earnings>52,325</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>26</LeadingLaps> <Laps>75</Laps> <Earnings>51,300</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1493</RaceID> <Race_Date>02/21/2013</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>Budweiser Duel 1</RaceName> <TrackName>Daytona International Speedway</TrackName> <Location>Daytona Beach, FL</Location> <TV_Listing>SPEED</TV_Listing> <Laps>60</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>23</LeadingLaps> <Laps>60</Laps> <Earnings>57,792</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>49</DriverID> <Name>Greg Biffle</Name> <LeadingLaps>0</LeadingLaps> <Laps>60</Laps> <Earnings>42,789</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>59</DriverID> <Name>Juan Pablo Montoya</Name> <LeadingLaps>0</LeadingLaps> <Laps>60</Laps> <Earnings>37,789</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>0</LeadingLaps> <Laps>60</Laps> <Earnings>23,789</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>60</Laps> <Earnings>30,789</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1494</RaceID> <Race_Date>02/21/2013</Race_Date> <Race_Time>04:00 PM</Race_Time> <RaceName>Budweiser Duel 2</RaceName> <TrackName>Daytona International Speedway</TrackName> <Location>Daytona Beach, FL</Location> <TV_Listing>SPEED</TV_Listing> <Laps>60</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>19</LeadingLaps> <Laps>60</Laps> <Earnings>58,977</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>0</LeadingLaps> <Laps>60</Laps> <Earnings>43,963</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>1321</DriverID> <Name>Austin Dillon</Name> <LeadingLaps>0</LeadingLaps> <Laps>60</Laps> <Earnings>38,963</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>1</LeadingLaps> <Laps>60</Laps> <Earnings>33,963</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>0</LeadingLaps> <Laps>60</Laps> <Earnings>31,963</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1495</RaceID> <Race_Date>02/24/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Daytona 500</RaceName> <TrackName>Daytona International Speedway</TrackName> <Location>Daytona Beach, FL</Location> <TV_Listing>FOX</TV_Listing> <Laps>200</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>17</LeadingLaps> <Laps>200</Laps> <Earnings>1,525,275</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>1,104,814</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>32</DriverID> <Name>Mark Martin</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>817,013</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>13</LeadingLaps> <Laps>200</Laps> <Earnings>707,855</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>47</DriverID> <Name>Ryan Newman</Name> <LeadingLaps>3</LeadingLaps> <Laps>200</Laps> <Earnings>578,471</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1496</RaceID> <Race_Date>03/03/2013</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>Subway Fresh Fit 500</RaceName> <TrackName>Phoenix International Raceway</TrackName> <Location>Avondale, AZ</Location> <TV_Listing>FOX</TV_Listing> <Laps>316</Laps> <TrackLength>1.0</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>122</LeadingLaps> <Laps>316</Laps> <Earnings>298,875</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>1</LeadingLaps> <Laps>316</Laps> <Earnings>209,686</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>490</DriverID> <Name>Denny Hamlin</Name> <LeadingLaps>0</LeadingLaps> <Laps>316</Laps> <Earnings>157,575</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>16</LeadingLaps> <Laps>316</Laps> <Earnings>168,076</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>47</LeadingLaps> <Laps>316</Laps> <Earnings>130,750</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1497</RaceID> <Race_Date>03/10/2013</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>Kobalt Tools 400</RaceName> <TrackName>Las Vegas Motor Speedway</TrackName> <Location>Las Vegas, NV</Location> <TV_Listing>FOX</TV_Listing> <Laps>267</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>42</LeadingLaps> <Laps>267</Laps> <Earnings>408,666</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>114</LeadingLaps> <Laps>267</Laps> <Earnings>284,340</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>12</LeadingLaps> <Laps>267</Laps> <Earnings>248,956</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>27</LeadingLaps> <Laps>267</Laps> <Earnings>208,698</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>180,590</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1498</RaceID> <Race_Date>03/17/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Food City 500</RaceName> <TrackName>Bristol Motor Speedway</TrackName> <Location>Bristol, TN</Location> <TV_Listing>FOX</TV_Listing> <Laps>500</Laps> <TrackLength>0.533</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>109</LeadingLaps> <Laps>500</Laps> <Earnings>176,760</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>56</LeadingLaps> <Laps>500</Laps> <Earnings>188,893</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>62</LeadingLaps> <Laps>500</Laps> <Earnings>168,651</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>1</LeadingLaps> <Laps>500</Laps> <Earnings>134,255</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>144,543</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1499</RaceID> <Race_Date>03/24/2013</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>Auto Club 400</RaceName> <TrackName>Auto Club Speedway</TrackName> <Location>Fontana, CA</Location> <TV_Listing>FOX</TV_Listing> <Laps>200</Laps> <TrackLength>2.0</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>125</LeadingLaps> <Laps>200</Laps> <Earnings>334,233</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>212,340</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>41</LeadingLaps> <Laps>200</Laps> <Earnings>193,673</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>181,815</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>146,585</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1500</RaceID> <Race_Date>04/07/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>STP Gas Booster 500</RaceName> <TrackName>Martinsville Speedway</TrackName> <Location>Martinsville, VA</Location> <TV_Listing>FOX</TV_Listing> <Laps>500</Laps> <TrackLength>0.526</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>346</LeadingLaps> <Laps>500</Laps> <Earnings>214,471</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>164,893</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>146,446</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>112,385</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>56</LeadingLaps> <Laps>500</Laps> <Earnings>145,278</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1501</RaceID> <Race_Date>04/13/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>NRA 500</RaceName> <TrackName>Texas Motor Speedway</TrackName> <Location>Fort Worth, TX</Location> <TV_Listing>FOX</TV_Listing> <Laps>334</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>171</LeadingLaps> <Laps>334</Laps> <Earnings>550,858</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>142</LeadingLaps> <Laps>334</Laps> <Earnings>346,555</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>0</LeadingLaps> <Laps>334</Laps> <Earnings>268,605</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>49</DriverID> <Name>Greg Biffle</Name> <LeadingLaps>0</LeadingLaps> <Laps>334</Laps> <Earnings>214,855</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>1</LeadingLaps> <Laps>334</Laps> <Earnings>209,913</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1502</RaceID> <Race_Date>04/21/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>STP 400</RaceName> <TrackName>Kansas Speedway</TrackName> <Location>Kansas City, KS</Location> <TV_Listing>FOX</TV_Listing> <Laps>267</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>163</LeadingLaps> <Laps>267</Laps> <Earnings>263,816</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>182,085</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>9</LeadingLaps> <Laps>267</Laps> <Earnings>185,021</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>46</LeadingLaps> <Laps>267</Laps> <Earnings>155,985</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>156,218</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1503</RaceID> <Race_Date>04/27/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>Toyota Owners 400</RaceName> <TrackName>Richmond International Raceway</TrackName> <Location>Richmond, VA</Location> <TV_Listing>FOX</TV_Listing> <Laps>406</Laps> <TrackLength>0.75</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>3</LeadingLaps> <Laps>406</Laps> <Earnings>242,511</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>113</LeadingLaps> <Laps>406</Laps> <Earnings>196,668</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>0</LeadingLaps> <Laps>406</Laps> <Earnings>161,618</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>59</DriverID> <Name>Juan Pablo Montoya</Name> <LeadingLaps>67</LeadingLaps> <Laps>406</Laps> <Earnings>147,474</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>16</DriverID> <Name>Jeff Burton</Name> <LeadingLaps>7</LeadingLaps> <Laps>406</Laps> <Earnings>118,435</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1504</RaceID> <Race_Date>05/05/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Aaron's 499</RaceName> <TrackName>Talladega Superspeedway</TrackName> <Location>Talladega, AL</Location> <TV_Listing>FOX</TV_Listing> <Laps>192</Laps> <TrackLength>2.66</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>455</DriverID> <Name>David Ragan</Name> <LeadingLaps>4</LeadingLaps> <Laps>192</Laps> <Earnings>373,108</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>399</DriverID> <Name>David Gilliland</Name> <LeadingLaps>0</LeadingLaps> <Laps>192</Laps> <Earnings>235,153</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>5</LeadingLaps> <Laps>192</Laps> <Earnings>207,720</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>46</DriverID> <Name>Michael Waltrip</Name> <LeadingLaps>0</LeadingLaps> <Laps>192</Laps> <Earnings>155,620</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>16</LeadingLaps> <Laps>192</Laps> <Earnings>181,426</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1505</RaceID> <Race_Date>05/11/2013</Race_Date> <Race_Time>07:00 PM</Race_Time> <RaceName>Bojangles Southern 500</RaceName> <TrackName>Darlington Raceway</TrackName> <Location>Darlington, SC</Location> <TV_Listing>FOX</TV_Listing> <Laps>367</Laps> <TrackLength>1.366</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>17</LeadingLaps> <Laps>367</Laps> <Earnings>314,866</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>490</DriverID> <Name>Denny Hamlin</Name> <LeadingLaps>0</LeadingLaps> <Laps>367</Laps> <Earnings>211,465</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>16</LeadingLaps> <Laps>367</Laps> <Earnings>200,026</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>0</LeadingLaps> <Laps>367</Laps> <Earnings>178,876</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>0</LeadingLaps> <Laps>367</Laps> <Earnings>165,976</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1506</RaceID> <Race_Date>05/18/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>Sprint Showdown</RaceName> <TrackName>Charlotte Motor Speedway</TrackName> <Location>Concord, NC</Location> <TV_Listing>SPEED</TV_Listing> <Laps>40</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>34</DriverID> <Name>Jamie McMurray</Name> <LeadingLaps>40</LeadingLaps> <Laps>40</Laps> <Earnings>50,915</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>1341</DriverID> <Name>Ricky Stenhouse Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>40</Laps> <Earnings>40,915</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>16</DriverID> <Name>Jeff Burton</Name> <LeadingLaps>0</LeadingLaps> <Laps>40</Laps> <Earnings>36,640</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>310</DriverID> <Name>Paul Menard</Name> <LeadingLaps>0</LeadingLaps> <Laps>40</Laps> <Earnings>34,540</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>40</Laps> <Earnings>33,540</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1507</RaceID> <Race_Date>05/18/2013</Race_Date> <Race_Time>09:00 PM</Race_Time> <RaceName>NASCAR Sprint All-Star Race</RaceName> <TrackName>Charlotte Motor Speedway</TrackName> <Location>Concord, NC</Location> <TV_Listing>SPEED</TV_Listing> <Laps>90</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>10</LeadingLaps> <Laps>90</Laps> <Earnings>1,039,175</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>0</LeadingLaps> <Laps>90</Laps> <Earnings>244,175</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>29</LeadingLaps> <Laps>90</Laps> <Earnings>144,175</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>11</LeadingLaps> <Laps>90</Laps> <Earnings>114,150</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>29</LeadingLaps> <Laps>90</Laps> <Earnings>109,150</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1508</RaceID> <Race_Date>05/26/2013</Race_Date> <Race_Time>06:00 PM</Race_Time> <RaceName>Coca-Cola 600</RaceName> <TrackName>Charlotte Motor Speedway</TrackName> <Location>Concord, NC</Location> <TV_Listing>FOX</TV_Listing> <Laps>400</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>28</LeadingLaps> <Laps>400</Laps> <Earnings>407,011</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>161</LeadingLaps> <Laps>400</Laps> <Earnings>291,615</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>8</LeadingLaps> <Laps>400</Laps> <Earnings>218,560</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>490</DriverID> <Name>Denny Hamlin</Name> <LeadingLaps>6</LeadingLaps> <Laps>400</Laps> <Earnings>220,915</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>0</LeadingLaps> <Laps>400</Laps> <Earnings>174,823</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1509</RaceID> <Race_Date>06/02/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>FedEx 400</RaceName> <TrackName>Dover International Speedway</TrackName> <Location>Dover, DE</Location> <TV_Listing>FOX</TV_Listing> <Laps>400</Laps> <TrackLength>1.0</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>43</DriverID> <Name>Tony Stewart</Name> <LeadingLaps>139</LeadingLaps> <Laps>400</Laps> <Earnings>318,100</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>59</DriverID> <Name>Juan Pablo Montoya</Name> <LeadingLaps>19</LeadingLaps> <Laps>400</Laps> <Earnings>226,504</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>0</LeadingLaps> <Laps>400</Laps> <Earnings>203,051</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>150</LeadingLaps> <Laps>400</Laps> <Earnings>196,198</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>2</LeadingLaps> <Laps>400</Laps> <Earnings>177,431</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1510</RaceID> <Race_Date>06/09/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Party in the Poconos 400</RaceName> <TrackName>Pocono Raceway</TrackName> <Location>Long Pond, PA</Location> <TV_Listing>TNT</TV_Listing> <Laps>160</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>128</LeadingLaps> <Laps>160</Laps> <Earnings>244,436</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>49</DriverID> <Name>Greg Biffle</Name> <LeadingLaps>0</LeadingLaps> <Laps>160</Laps> <Earnings>179,185</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>160</Laps> <Earnings>143,060</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>43</DriverID> <Name>Tony Stewart</Name> <LeadingLaps>0</LeadingLaps> <Laps>160</Laps> <Earnings>165,810</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>47</DriverID> <Name>Ryan Newman</Name> <LeadingLaps>19</LeadingLaps> <Laps>160</Laps> <Earnings>144,343</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1511</RaceID> <Race_Date>06/16/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Quicken Loans 400</RaceName> <TrackName>Michigan International Speedway</TrackName> <Location>Brooklyn, MI</Location> <TV_Listing>TNT</TV_Listing> <Laps>200</Laps> <TrackLength>2.0</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>49</DriverID> <Name>Greg Biffle</Name> <LeadingLaps>48</LeadingLaps> <Laps>200</Laps> <Earnings>240,460</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>173,781</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>145,670</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>148,803</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>43</DriverID> <Name>Tony Stewart</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>142,085</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1513</RaceID> <Race_Date>06/23/2013</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>Toyota/Save Mart 350</RaceName> <TrackName>Sonoma Raceway</TrackName> <Location>Sonoma, CA</Location> <TV_Listing>TNT</TV_Listing> <Laps>110</Laps> <TrackLength>1.99</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>51</LeadingLaps> <Laps>110</Laps> <Earnings>309,250</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>4</LeadingLaps> <Laps>110</Laps> <Earnings>240,451</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>0</LeadingLaps> <Laps>110</Laps> <Earnings>198,140</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>15</LeadingLaps> <Laps>110</Laps> <Earnings>154,860</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>110</Laps> <Earnings>157,548</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1514</RaceID> <Race_Date>06/30/2013</Race_Date> <Race_Time>12:00 PM</Race_Time> <RaceName>Quaker State 400</RaceName> <TrackName>Kentucky Speedway</TrackName> <Location>Sparta, KY</Location> <TV_Listing>TNT</TV_Listing> <Laps>267</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>38</LeadingLaps> <Laps>267</Laps> <Earnings>200,451</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>34</DriverID> <Name>Jamie McMurray</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>159,115</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>146,078</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>130,338</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>139,743</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1515</RaceID> <Race_Date>07/06/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>Coke Zero 400</RaceName> <TrackName>Daytona International Speedway</TrackName> <Location>Daytona Beach, FL</Location> <TV_Listing>TNT</TV_Listing> <Laps>161</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>94</LeadingLaps> <Laps>161</Laps> <Earnings>327,961</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>43</DriverID> <Name>Tony Stewart</Name> <LeadingLaps>0</LeadingLaps> <Laps>161</Laps> <Earnings>254,490</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>0</LeadingLaps> <Laps>161</Laps> <Earnings>224,301</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>161</Laps> <Earnings>182,073</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>46</DriverID> <Name>Michael Waltrip</Name> <LeadingLaps>0</LeadingLaps> <Laps>161</Laps> <Earnings>141,365</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1516</RaceID> <Race_Date>07/14/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Camping World RV Sales 301</RaceName> <TrackName>New Hampshire Motor Speedway</TrackName> <Location>Loudon, NH</Location> <TV_Listing>TNT</TV_Listing> <Laps>302</Laps> <TrackLength>1.058</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>118</DriverID> <Name>Brian Vickers</Name> <LeadingLaps>16</LeadingLaps> <Laps>302</Laps> <Earnings>214,075</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>53</LeadingLaps> <Laps>302</Laps> <Earnings>228,043</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>16</DriverID> <Name>Jeff Burton</Name> <LeadingLaps>0</LeadingLaps> <Laps>302</Laps> <Earnings>147,135</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>14</LeadingLaps> <Laps>302</Laps> <Earnings>179,076</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>580</DriverID> <Name>Aric Almirola</Name> <LeadingLaps>0</LeadingLaps> <Laps>302</Laps> <Earnings>152,496</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1517</RaceID> <Race_Date>07/28/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Crown Royal 400 at the Brickyard</RaceName> <TrackName>Indianapolis Motor Speedway</TrackName> <Location>Indianapolis, IN</Location> <TV_Listing>ESPN</TV_Listing> <Laps>160</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>47</DriverID> <Name>Ryan Newman</Name> <LeadingLaps>45</LeadingLaps> <Laps>160</Laps> <Earnings>423,033</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>73</LeadingLaps> <Laps>160</Laps> <Earnings>379,736</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>0</LeadingLaps> <Laps>160</Laps> <Earnings>299,500</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>43</DriverID> <Name>Tony Stewart</Name> <LeadingLaps>0</LeadingLaps> <Laps>160</Laps> <Earnings>300,650</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>0</LeadingLaps> <Laps>160</Laps> <Earnings>273,266</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1518</RaceID> <Race_Date>08/04/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>GoBowling.com 400</RaceName> <TrackName>Pocono Raceway</TrackName> <Location>Long Pond, PA</Location> <TV_Listing>ESPN</TV_Listing> <Laps>160</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>66</LeadingLaps> <Laps>160</Laps> <Earnings>208,500</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>7</LeadingLaps> <Laps>160</Laps> <Earnings>199,221</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>9</LeadingLaps> <Laps>160</Laps> <Earnings>153,930</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>47</DriverID> <Name>Ryan Newman</Name> <LeadingLaps>2</LeadingLaps> <Laps>160</Laps> <Earnings>161,343</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>2</LeadingLaps> <Laps>160</Laps> <Earnings>130,585</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1519</RaceID> <Race_Date>08/11/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Cheez-It 355 at the Glen</RaceName> <TrackName>Watkins Glen International</TrackName> <Location>Watkins Glen, NY</Location> <TV_Listing>ESPN</TV_Listing> <Laps>90</Laps> <TrackLength>2.45</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>29</LeadingLaps> <Laps>90</Laps> <Earnings>236,658</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>0</LeadingLaps> <Laps>90</Laps> <Earnings>204,876</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>90</Laps> <Earnings>161,735</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>0</LeadingLaps> <Laps>90</Laps> <Earnings>149,360</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>59</DriverID> <Name>Juan Pablo Montoya</Name> <LeadingLaps>1</LeadingLaps> <Laps>90</Laps> <Earnings>137,524</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1520</RaceID> <Race_Date>08/18/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Pure Michigan 400</RaceName> <TrackName>Michigan International Speedway</TrackName> <Location>Brooklyn, MI</Location> <TV_Listing>ESPN</TV_Listing> <Laps>200</Laps> <TrackLength>2.0</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>51</LeadingLaps> <Laps>200</Laps> <Earnings>252,393</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>180,731</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>43</LeadingLaps> <Laps>200</Laps> <Earnings>136,315</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>310</DriverID> <Name>Paul Menard</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>143,486</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>145,493</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1521</RaceID> <Race_Date>08/24/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>IRWIN Tools Night Race</RaceName> <TrackName>Bristol Motor Speedway</TrackName> <Location>Bristol, TN</Location> <TV_Listing>ABC</TV_Listing> <Laps>500</Laps> <TrackLength>0.533</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>149</LeadingLaps> <Laps>500</Laps> <Earnings>328,466</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>214,815</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>59</DriverID> <Name>Juan Pablo Montoya</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>200,529</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>118</DriverID> <Name>Brian Vickers</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>150,315</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>155,973</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1522</RaceID> <Race_Date>09/01/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>AdvoCare 500</RaceName> <TrackName>Atlanta Motor Speedway</TrackName> <Location>Hampton, GA</Location> <TV_Listing>ESPN</TV_Listing> <Laps>325</Laps> <TrackLength>1.54</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>36</LeadingLaps> <Laps>325</Laps> <Earnings>338,058</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>78</LeadingLaps> <Laps>325</Laps> <Earnings>244,473</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>325</Laps> <Earnings>207,065</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>325</Laps> <Earnings>165,235</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>47</DriverID> <Name>Ryan Newman</Name> <LeadingLaps>3</LeadingLaps> <Laps>325</Laps> <Earnings>167,848</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1523</RaceID> <Race_Date>09/07/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>Federated Auto Parts 400</RaceName> <TrackName>Richmond International Raceway</TrackName> <Location>Richmond, VA</Location> <TV_Listing>ABC</TV_Listing> <Laps>400</Laps> <TrackLength>0.75</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>46</LeadingLaps> <Laps>400</Laps> <Earnings>286,475</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>73</LeadingLaps> <Laps>400</Laps> <Earnings>185,355</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>47</DriverID> <Name>Ryan Newman</Name> <LeadingLaps>4</LeadingLaps> <Laps>400</Laps> <Earnings>181,443</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>34</DriverID> <Name>Jamie McMurray</Name> <LeadingLaps>6</LeadingLaps> <Laps>400</Laps> <Earnings>151,805</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>310</DriverID> <Name>Paul Menard</Name> <LeadingLaps>3</LeadingLaps> <Laps>400</Laps> <Earnings>140,701</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1524</RaceID> <Race_Date>09/15/2013</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>GEICO 400</RaceName> <TrackName>Chicagoland Speedway</TrackName> <Location>Joliet, IL</Location> <TV_Listing>ESPN</TV_Listing> <Laps>267</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>89</LeadingLaps> <Laps>267</Laps> <Earnings>334,891</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>67</LeadingLaps> <Laps>267</Laps> <Earnings>261,048</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>2</LeadingLaps> <Laps>267</Laps> <Earnings>221,326</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>169,960</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>40</LeadingLaps> <Laps>267</Laps> <Earnings>176,926</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1525</RaceID> <Race_Date>09/22/2013</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>Sylvania 300</RaceName> <TrackName>New Hampshire Motor Speedway</TrackName> <Location>Loudon, NH</Location> <TV_Listing>ESPN</TV_Listing> <Laps>300</Laps> <TrackLength>1.058</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>106</LeadingLaps> <Laps>300</Laps> <Earnings>262,066</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>300</Laps> <Earnings>210,143</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>49</DriverID> <Name>Greg Biffle</Name> <LeadingLaps>0</LeadingLaps> <Laps>300</Laps> <Earnings>151,785</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>1</LeadingLaps> <Laps>300</Laps> <Earnings>160,796</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>34</DriverID> <Name>Jamie McMurray</Name> <LeadingLaps>0</LeadingLaps> <Laps>300</Laps> <Earnings>142,005</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1526</RaceID> <Race_Date>09/29/2013</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>AAA 400</RaceName> <TrackName>Dover International Speedway</TrackName> <Location>Dover, DE</Location> <TV_Listing>ESPN</TV_Listing> <Laps>400</Laps> <TrackLength>1.0</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>243</LeadingLaps> <Laps>400</Laps> <Earnings>243,836</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>80</LeadingLaps> <Laps>400</Laps> <Earnings>197,210</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>0</LeadingLaps> <Laps>400</Laps> <Earnings>166,068</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>3</LeadingLaps> <Laps>400</Laps> <Earnings>168,296</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>30</LeadingLaps> <Laps>400</Laps> <Earnings>162,068</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1527</RaceID> <Race_Date>10/06/2013</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>Hollywood Casino 400</RaceName> <TrackName>Kansas Speedway</TrackName> <Location>Kansas City, KS</Location> <TV_Listing>ESPN</TV_Listing> <Laps>267</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>138</LeadingLaps> <Laps>267</Laps> <Earnings>364,636</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>229,810</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>216,776</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>33</LeadingLaps> <Laps>267</Laps> <Earnings>176,473</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>169,965</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1528</RaceID> <Race_Date>10/12/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>Bank of America 500</RaceName> <TrackName>Charlotte Motor Speedway</TrackName> <Location>Concord, NC</Location> <TV_Listing>ABC</TV_Listing> <Laps>334</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>11</LeadingLaps> <Laps>334</Laps> <Earnings>314,441</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>138</LeadingLaps> <Laps>334</Laps> <Earnings>224,810</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>1</LeadingLaps> <Laps>334</Laps> <Earnings>199,426</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>130</LeadingLaps> <Laps>334</Laps> <Earnings>192,721</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>4</LeadingLaps> <Laps>334</Laps> <Earnings>163,568</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1529</RaceID> <Race_Date>10/20/2013</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>Camping World RV Sales 500</RaceName> <TrackName>Talladega Superspeedway</TrackName> <Location>Talladega, AL</Location> <TV_Listing>ESPN</TV_Listing> <Laps>188</Laps> <TrackLength>2.66</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>34</DriverID> <Name>Jamie McMurray</Name> <LeadingLaps>16</LeadingLaps> <Laps>188</Laps> <Earnings>236,345</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>38</LeadingLaps> <Laps>188</Laps> <Earnings>185,410</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>1341</DriverID> <Name>Ricky Stenhouse Jr.</Name> <LeadingLaps>6</LeadingLaps> <Laps>188</Laps> <Earnings>187,596</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>310</DriverID> <Name>Paul Menard</Name> <LeadingLaps>0</LeadingLaps> <Laps>188</Laps> <Earnings>154,726</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>9</LeadingLaps> <Laps>188</Laps> <Earnings>162,068</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1530</RaceID> <Race_Date>10/27/2013</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>Goody's Headache Relief Shot 500</RaceName> <TrackName>Martinsville Speedway</TrackName> <Location>Ridgeway, VA</Location> <TV_Listing>ESPN</TV_Listing> <Laps>500</Laps> <TrackLength>0.526</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>78</LeadingLaps> <Laps>500</Laps> <Earnings>188,796</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>202</LeadingLaps> <Laps>500</Laps> <Earnings>177,736</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>60</LeadingLaps> <Laps>500</Laps> <Earnings>141,478</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>153,436</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>123</LeadingLaps> <Laps>500</Laps> <Earnings>144,046</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1531</RaceID> <Race_Date>11/03/2013</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>AAA Texas 500</RaceName> <TrackName>Texas Motor Speedway</TrackName> <Location>Fort Worth, TX</Location> <TV_Listing>ESPN</TV_Listing> <Laps>334</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>255</LeadingLaps> <Laps>334</Laps> <Earnings>484,211</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>334</Laps> <Earnings>337,810</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>1</LeadingLaps> <Laps>334</Laps> <Earnings>256,393</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>3</LeadingLaps> <Laps>334</Laps> <Earnings>238,776</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>0</LeadingLaps> <Laps>334</Laps> <Earnings>180,585</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1532</RaceID> <Race_Date>11/10/2013</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>AdvoCare 500</RaceName> <TrackName>Phoenix International Raceway</TrackName> <Location>Avondale, AZ</Location> <TV_Listing>ESPN</TV_Listing> <Laps>312</Laps> <TrackLength>1.0</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>70</LeadingLaps> <Laps>312</Laps> <Earnings>263,386</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>41</LeadingLaps> <Laps>312</Laps> <Earnings>171,715</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>1</LeadingLaps> <Laps>312</Laps> <Earnings>182,326</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>2</LeadingLaps> <Laps>312</Laps> <Earnings>131,135</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>312</Laps> <Earnings>137,630</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1533</RaceID> <Race_Date>11/17/2013</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>Ford EcoBoost 400</RaceName> <TrackName>Homestead-Miami Speedway</TrackName> <Location>Homestead, FL</Location> <TV_Listing>ESPN</TV_Listing> <Laps>267</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>490</DriverID> <Name>Denny Hamlin</Name> <LeadingLaps>72</LeadingLaps> <Laps>267</Laps> <Earnings>322,350</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>144</LeadingLaps> <Laps>267</Laps> <Earnings>293,251</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>28</LeadingLaps> <Laps>267</Laps> <Earnings>203,860</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>179,435</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>167,968</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <time_stamp> January 13, 2014, at 11:34 AM ET </time_stamp> </message>
+ schemagen/scoresxml/20160114.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?> <!DOCTYPE message PUBLIC "-//TSN//DTD Scores 1.0/EN" "scoresxml.dtd"> <message> <XML_File_ID>20160114</XML_File_ID> <heading>BC-ADi+129:143* 0 0 0</heading> <game_id>18166</game_id> <schedule_id>18166</schedule_id> <category>Scores</category> <sport>NHL</sport> <location> <city>Montreal</city> <state>QUEBEC</state> <country>CANADA</country> </location> <location> <city>Ottawa</city> <state>ONTARIO</state> <country>CANADA</country> </location> <seasontype>Regular</seasontype> <game> <vteam id="129">Montreal</vteam> <hteam id="143">Ottawa</hteam> <vscore>0</vscore> <hscore>0</hscore> <status numeral="0" type="i">0 Period</status> <notes>Ottawa - Right Wing Chris Neil (1/16, lower body) is probable for Thursday's game against Montreal.</notes> </game> <time_stamp> January 16, 2014, at 10:39 AM ET </time_stamp> </message>
+ schemagen/scoresxml/20160285.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?> <!DOCTYPE message PUBLIC "-//TSN//DTD Scores 1.0/EN" "scoresxml.dtd"> <message> <XML_File_ID>20160285</XML_File_ID> <heading>BC-BLP+P26:P56* 7 7 1R14:56</heading> <game_id>50719</game_id> <schedule_id>50719</schedule_id> <category>Scores</category> <sport>CBASK-W</sport> <seasontype>Regular</seasontype> <game> <vteam id="P26">Campbell</vteam> <hteam id="P56">Gardner-Webb</hteam> <vscore>7</vscore> <hscore>7</hscore> <time_r>14:56</time_r> <status numeral="1" type="P">1 Half</status> </game> <time_stamp> January 16, 2014, at 11:17 AM ET </time_stamp> </message>
+ schemagen/scoresxml/20187479.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?> <!DOCTYPE message PUBLIC "-//TSN//DTD Scores 1.0/EN" "scoresxml.dtd"> <message> <XML_File_ID>20187479</XML_File_ID> <heading>BC-AFP+YX9:YX8* 7 0 1R 4:40</heading> <game_id>42485</game_id> <schedule_id>42485</schedule_id> <tsnupdate>True</tsnupdate> <category>Scores</category> <sport>CFOOT</sport> <seasontype>Regular</seasontype> <game> <vteam id="YX9">American</vteam> <hteam id="YX8">National</hteam> <vscore>7</vscore> <hscore>0</hscore> <time_r>4:40</time_r> <status numeral="1" type="P">1 Qtr</status> </game> <time_stamp> January 18, 2014, at 06:37 PM ET </time_stamp> </message>
src/Main.hs view
@@ -45,12 +45,18 @@ report_info, report_error ) import TSN.DbImport ( DbImport(..), ImportResult(..) )-import qualified TSN.XML.Heartbeat as Heartbeat ( verify )-import qualified TSN.XML.Injuries as Injuries ( pickle_message )-import qualified TSN.XML.InjuriesDetail as InjuriesDetail ( pickle_message )-import qualified TSN.XML.News as News ( pickle_message )-import qualified TSN.XML.Odds as Odds ( pickle_message )-import qualified TSN.XML.Weather as Weather ( pickle_message )+import qualified TSN.XML.AutoRacingSchedule as AutoRacingSchedule (+ dtd,+ pickle_message )+import qualified TSN.XML.Heartbeat as Heartbeat ( dtd, verify )+import qualified TSN.XML.Injuries as Injuries ( dtd, pickle_message )+import qualified TSN.XML.InjuriesDetail as InjuriesDetail (+ dtd,+ pickle_message )+import qualified TSN.XML.News as News ( dtd, pickle_message )+import qualified TSN.XML.Odds as Odds ( dtd, pickle_message )+import qualified TSN.XML.Scores as Scores ( dtd, pickle_message )+import qualified TSN.XML.Weather as Weather ( dtd, pickle_message ) import Xml ( DtdName(..), parse_opts ) @@ -136,7 +142,7 @@ import_with_dtd (DtdName dtd,xml) -- We special-case the heartbeat so it doesn't have to run in -- the database monad.- | dtd == "Heartbeat.dtd" = Heartbeat.verify xml+ | dtd == Heartbeat.dtd = Heartbeat.verify xml | otherwise = -- We need NoMonomorphismRestriction here. if backend cfg == Postgres@@ -144,43 +150,51 @@ else withSqliteConn cs $ runDbConn importer where -- | Pull the real connection String out of the configuration.+ -- cs :: String cs = get_connection_string $ connection_string cfg -- | Convenience; we use this everywhere below in 'importer'.+ -- migrate_and_import m = dbmigrate m >> dbimport m importer- | dtd == "injuriesxml.dtd" = do+ | dtd == AutoRacingSchedule.dtd = do+ let m = unpickleDoc AutoRacingSchedule.pickle_message xml+ maybe (return $ ImportFailed errmsg) migrate_and_import m++ | dtd == Injuries.dtd = do let m = unpickleDoc Injuries.pickle_message xml- let errmsg = "Could not unpickle injuriesxml." maybe (return $ ImportFailed errmsg) migrate_and_import m - | dtd == "Injuries_Detail_XML.dtd" = do+ | dtd == InjuriesDetail.dtd = do let m = unpickleDoc InjuriesDetail.pickle_message xml- let errmsg = "Could not unpickle Injuries_Detail_XML." maybe (return $ ImportFailed errmsg) migrate_and_import m - | dtd == "newsxml.dtd" = do+ | dtd == News.dtd = do let m = unpickleDoc News.pickle_message xml- let errmsg = "Could not unpickle newsxml." maybe (return $ ImportFailed errmsg) migrate_and_import m - | dtd == "Odds_XML.dtd" = do+ | dtd == Odds.dtd = do let m = unpickleDoc Odds.pickle_message xml- let errmsg = "Could not unpickle Odds_XML." maybe (return $ ImportFailed errmsg) migrate_and_import m - | dtd == "weatherxml.dtd" = do+ | dtd == Scores.dtd = do+ let m = unpickleDoc Scores.pickle_message xml+ maybe (return $ ImportFailed errmsg) migrate_and_import m++ | dtd == Weather.dtd = do let m = unpickleDoc Weather.pickle_message xml- let errmsg = "Could not unpickle weatherxml." maybe (return $ ImportFailed errmsg) migrate_and_import m | otherwise = do let infomsg = "Unrecognized DTD in " ++ path ++ ": " ++ dtd ++ "." return $ ImportUnsupported infomsg++ where+ errmsg = "Could not unpickle " ++ dtd ++ "." -- | Entry point of the program. It twiddles some knobs for
src/TSN/Picklers.hs view
@@ -4,6 +4,7 @@ module TSN.Picklers ( xp_date, xp_gamedate,+ xp_tba_time, xp_time, xp_time_stamp ) where@@ -14,6 +15,7 @@ import System.Locale ( defaultTimeLocale ) import Text.XML.HXT.Arrow.Pickle ( xpText,+ xpWrap, xpWrapMaybe ) import Text.XML.HXT.Arrow.Pickle.Xml ( PU ) @@ -99,6 +101,22 @@ from_time :: UTCTime -> String from_time = formatTime defaultTimeLocale xp_time_format ++-- | (Un)pickle a UTCTime without the date portion, allowing for a+-- value of \"TBA\" (which gets translated to 'Nothing').+--+xp_tba_time :: PU (Maybe UTCTime)+xp_tba_time =+ (to_time, from_time) `xpWrap` xpText+ where+ to_time :: String -> Maybe UTCTime+ to_time s+ | s == "TBA" = Nothing+ | otherwise = parseTime defaultTimeLocale xp_time_format s++ from_time :: Maybe UTCTime -> String+ from_time Nothing = ""+ from_time (Just t) = formatTime defaultTimeLocale xp_time_format t -- | (Un)pickle the \<time_stamp\> element format to/from a 'UTCTime'.
+ src/TSN/XML/AutoRacingSchedule.hs view
@@ -0,0 +1,565 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}++-- | Parse TSN XML for the DTD+-- \"Auto_Racing_Schedule_XML.dtd\". There's a top-level+-- \<message\>, containing \<Listing\>s, containing \<RaceResults\>,+-- containing \<RaceResultsListing\>s.+--+module TSN.XML.AutoRacingSchedule (+ dtd,+ pickle_message,+ -- * Tests+ auto_racing_schedule_tests,+ -- * WARNING: these are private but exported to silence warnings+ AutoRacingScheduleConstructor(..),+ AutoRacingScheduleListingConstructor(..),+ AutoRacingScheduleListingRaceResultRaceResultListingConstructor(..) )+where++-- System imports.+import Control.Monad ( forM_ )+import Data.Time ( UTCTime(..) )+import Data.Tuple.Curry ( uncurryN )+import Database.Groundhog (+ countAll,+ executeRaw,+ migrate,+ runMigration,+ silentMigrationLogger )+import Database.Groundhog.Core ( DefaultKey )+import Database.Groundhog.Generic ( runDbConn )+import Database.Groundhog.Sqlite ( withSqliteConn )+import Database.Groundhog.TH (+ groundhog,+ mkPersist )+import Test.Tasty ( TestTree, testGroup )+import Test.Tasty.HUnit ( (@?=), testCase )+import Text.XML.HXT.Core (+ PU,+ xp7Tuple,+ xp8Tuple,+ xp10Tuple,+ xpElem,+ xpInt,+ xpList,+ xpOption,+ xpText,+ xpWrap )++-- Local imports.+import TSN.Codegen (+ tsn_codegen_config )+import TSN.DbImport ( DbImport(..), ImportResult(..), run_dbmigrate )+import TSN.Picklers ( xp_date, xp_tba_time, xp_time_stamp )+import TSN.XmlImport ( XmlImport(..), XmlImportFk(..) )+import Xml (+ FromXml(..),+ FromXmlFk(..),+ ToDb(..),+ pickle_unpickle,+ unpickleable,+ unsafe_unpickle )+++-- | The DTD to which this module corresponds. Used to invoke dbimport.+--+dtd :: String+dtd = "Auto_Racing_Schedule_XML.dtd"++--+-- DB/XML data types+--++-- * AutoRacingSchedule/Message++-- | Database representation of a 'Message'.+--+data AutoRacingSchedule =+ AutoRacingSchedule {+ db_xml_file_id :: Int,+ db_heading :: String,+ db_category :: String,+ db_sport :: String,+ db_title :: String,+ db_complete_through :: String,+ db_time_stamp :: UTCTime }+ deriving (Eq, Show)+++-- | XML Representation of an 'AutoRacingSchedule'.+--+data Message =+ Message {+ xml_xml_file_id :: Int,+ xml_heading :: String,+ xml_category :: String,+ xml_sport :: String,+ xml_title :: String,+ xml_complete_through :: String,+ xml_listings :: [AutoRacingScheduleListingXml],+ xml_time_stamp :: UTCTime }+ deriving (Eq, Show)+++instance ToDb Message where+ -- | The database analogue of a 'Message' is a 'AutoRacingSchedule'.+ --+ type Db Message = AutoRacingSchedule+++-- | The 'FromXml' instance for 'Message' is required for the+-- 'XmlImport' instance.+--+instance FromXml Message where+ -- | To convert a 'Message' to an 'AutoRacingSchedule', we just drop+ -- the 'xml_listings'.+ --+ from_xml Message{..} =+ AutoRacingSchedule {+ db_xml_file_id = xml_xml_file_id,+ db_heading = xml_heading,+ db_category = xml_category,+ db_sport = xml_sport,+ db_title = xml_title,+ db_complete_through = xml_complete_through,+ db_time_stamp = xml_time_stamp }+++-- | This allows us to insert the XML representation 'Message'+-- directly.+--+instance XmlImport Message+++-- * AutoRacingScheduleListing/AutoRacingScheduleListingXml++-- | Database representation of a \<Listing\> contained within a+-- \<Message\>. We combine the race date/time into a single+-- race_time, drop the race results list, and add a foreign key to+-- our parent.+--+data AutoRacingScheduleListing =+ AutoRacingScheduleListing {+ db_auto_racing_schedules_id :: DefaultKey AutoRacingSchedule,+ db_race_id :: Int,+ db_race_time :: UTCTime,+ db_race_name :: String,+ db_track_name :: String,+ db_location :: String,+ db_tv_listing :: Maybe String,+ db_laps :: Int,+ db_track_length :: String -- ^ Sometimes the word "miles" shows up.+ }+++-- | XML representation of a \<Listing\> contained within a+-- \<message\>.+--+data AutoRacingScheduleListingXml =+ AutoRacingScheduleListingXml {+ xml_race_id :: Int,+ xml_race_date :: UTCTime,+ xml_race_time :: Maybe UTCTime,+ xml_race_name :: String,+ xml_track_name :: String,+ xml_location :: String,+ xml_tv_listing :: Maybe String,+ xml_laps :: Int,+ xml_track_length :: String, -- ^ Sometimes the word \"miles\" shows up,+ -- so we can't do the right thing and use+ -- a 'Double'.+ xml_race_results :: [AutoRacingScheduleListingRaceResult] }+ deriving (Eq, Show)+++-- | Pseudo-accessor to get the race result listings out of a+-- 'AutoRacingScheduleListingXml'. A poor man's lens.+--+result_listings :: AutoRacingScheduleListingXml+ -> [AutoRacingScheduleListingRaceResultRaceResultListingXml]+result_listings = (concatMap xml_race_result_listing) . xml_race_results+++instance ToDb AutoRacingScheduleListingXml where+ -- | The database analogue of an 'AutoRacingScheduleListingXml' is+ -- an 'AutoRacingScheduleListing'.+ --+ type Db AutoRacingScheduleListingXml = AutoRacingScheduleListing++instance FromXmlFk AutoRacingScheduleListingXml where+ -- | Each 'AutoRacingScheduleListingXml' is contained in (i.e. has a+ -- foreign key to) a 'AutoRacingSchedule'.+ --+ type Parent AutoRacingScheduleListingXml = AutoRacingSchedule++ -- | To convert an 'AutoRacingScheduleListingXml' to an+ -- 'AutoRacingScheduleListing', we add the foreign key and drop+ -- the 'xml_race_results'. We also mash the date/time together+ -- into one field.+ --+ from_xml_fk fk AutoRacingScheduleListingXml{..} =+ AutoRacingScheduleListing {+ db_auto_racing_schedules_id = fk,+ db_race_id = xml_race_id,+ db_race_time = make_race_time xml_race_date xml_race_time,+ db_race_name = xml_race_name,+ db_track_name = xml_track_name,+ db_location = xml_location,+ db_tv_listing = xml_tv_listing,+ db_laps = xml_laps,+ db_track_length = xml_track_length }+ where+ -- | Make the database \"race time\" from the XML+ -- date/time. Simply take the day part from one and the time+ -- from the other.+ --+ make_race_time d Nothing = d+ make_race_time d (Just t) = UTCTime (utctDay d) (utctDayTime t)+++-- | This allows us to insert the XML representation+-- 'AutoRacingScheduleListingXml' directly.+--+instance XmlImportFk AutoRacingScheduleListingXml++++-- * AutoRacingScheduleListingRaceResult++-- | The XML representation of \<message\> -> \<Listing\> ->+-- \<RaceResults\>. This element serves only to contain+-- \<RaceResultsListing\>s, so we don't store the intermediate table+-- in the database.+--+newtype AutoRacingScheduleListingRaceResult =+ AutoRacingScheduleListingRaceResult {+ xml_race_result_listing ::+ [AutoRacingScheduleListingRaceResultRaceResultListingXml] }+ deriving (Eq, Show)+++-- * AutoRacingScheduleListingRaceResultRaceResultListing /+-- AutoRacingScheduleListingRaceResultRaceResultListingXml+--+-- Sorry about the names yo.+--++-- | Database representation of \<RaceResultListing\> within+-- \<RaceResults\> within \<Listing\> within... \<message\>!+--+data AutoRacingScheduleListingRaceResultRaceResultListing =+ AutoRacingScheduleListingRaceResultRaceResultListing {+ db_auto_racing_schedules_listings_id ::+ DefaultKey AutoRacingScheduleListing,+ db_finish_position :: Int,+ db_driver_id :: Int,+ db_name :: String,+ db_leading_laps :: Int,+ db_listing_laps :: Int, -- ^ Avoid clash with race's \"laps\" field.+ db_earnings :: String, -- ^ This should be an Int, but can have commas.+ db_status :: String }+++-- | XML Representation of an+-- 'AutoRacingScheduleListingRaceResultRaceResultListing'.+--+data AutoRacingScheduleListingRaceResultRaceResultListingXml =+ AutoRacingScheduleListingRaceResultRaceResultListingXml {+ xml_finish_position :: Int,+ xml_driver_id :: Int,+ xml_name :: String,+ xml_leading_laps :: Int,+ xml_listing_laps :: Int, -- ^ Avoid clash with race's \"laps\" field.+ xml_earnings :: String, -- ^ Should be an 'Int', but can have commas.+ xml_status :: String }+ deriving (Eq, Show)+++instance ToDb AutoRacingScheduleListingRaceResultRaceResultListingXml where+ -- | The database representation of an+ -- 'AutoRacingScheduleListingRaceResultRaceResultListingXml' is an+ -- 'AutoRacingScheduleListingRaceResultRaceResultListing'.+ --+ type Db AutoRacingScheduleListingRaceResultRaceResultListingXml =+ AutoRacingScheduleListingRaceResultRaceResultListing+++instance FromXmlFk AutoRacingScheduleListingRaceResultRaceResultListingXml where+ -- | Each 'AutoRacingScheduleListingRaceResultRaceResultListingXml'+ -- is contained in (i.e. has a foreign key to) an+ -- 'AutoRacingScheduleListing'. We skip the intermediate+ -- \<RaceResults\>.+ --+ type Parent AutoRacingScheduleListingRaceResultRaceResultListingXml =+ AutoRacingScheduleListing++ -- | To convert an+ -- 'AutoRacingScheduleListingRaceResultRaceResultListingXml' to an+ -- 'AutoRacingScheduleListingRaceResultRaceResultListing', we just+ -- add the foreign key to the parent 'AutoRacingScheduleListing'.+ --+ from_xml_fk fk AutoRacingScheduleListingRaceResultRaceResultListingXml{..} =+ AutoRacingScheduleListingRaceResultRaceResultListing {+ db_auto_racing_schedules_listings_id = fk,+ db_finish_position = xml_finish_position,+ db_driver_id = xml_driver_id,+ db_name = xml_name,+ db_leading_laps = xml_leading_laps,+ db_listing_laps = xml_listing_laps,+ db_earnings = xml_earnings,+ db_status = xml_earnings }+++-- | This allows us to insert the XML representation+-- 'AutoRacingScheduleListingRaceResultRaceResultListingXml'+-- directly.+--+instance XmlImportFk AutoRacingScheduleListingRaceResultRaceResultListingXml+++---+--- Database stuff.+---++instance DbImport Message where+ dbmigrate _ =+ run_dbmigrate $ do+ migrate (undefined :: AutoRacingSchedule)+ migrate (undefined :: AutoRacingScheduleListing)+ migrate (undefined+ :: AutoRacingScheduleListingRaceResultRaceResultListing)+++ -- | We insert the message, then use its ID to insert the listings,+ -- using their IDs to insert the race result listings.+ --+ dbimport m = do+ msg_id <- insert_xml m++ forM_ (xml_listings m) $ \listing -> do+ listing_id <- insert_xml_fk msg_id listing++ mapM_ (insert_xml_fk_ listing_id) (result_listings listing)++ return ImportSucceeded+++mkPersist tsn_codegen_config [groundhog|+- entity: AutoRacingSchedule+ dbName: auto_racing_schedules+ constructors:+ - name: AutoRacingSchedule+ uniques:+ - name: unique_auto_racing_schedule+ type: constraint+ # Prevent multiple imports of the same message.+ fields: [db_xml_file_id]++- entity: AutoRacingScheduleListing+ dbName: auto_racing_schedules_listings+ constructors:+ - name: AutoRacingScheduleListing+ fields:+ - name: db_auto_racing_schedules_id+ reference:+ onDelete: cascade++- entity: AutoRacingScheduleListingRaceResultRaceResultListing+ dbName: auto_racing_schedules_listings_race_result_listings+ constructors:+ - name: AutoRacingScheduleListingRaceResultRaceResultListing+ fields:+ - name: db_auto_racing_schedules_listings_id+ reference:+ onDelete: cascade+|]++++---+--- Pickling+---++-- | Pickler for the top-level 'Message'.+--+pickle_message :: PU Message+pickle_message =+ xpElem "message" $+ xpWrap (from_tuple, to_tuple) $+ xp8Tuple (xpElem "XML_File_ID" xpInt)+ (xpElem "heading" xpText)+ (xpElem "category" xpText)+ (xpElem "sport" xpText)+ (xpElem "Title" xpText)+ (xpElem "Complete_Through" xpText)+ (xpList pickle_listing)+ (xpElem "time_stamp" xp_time_stamp)+ where+ from_tuple = uncurryN Message+ to_tuple m = (xml_xml_file_id m,+ xml_heading m,+ xml_category m,+ xml_sport m,+ xml_title m,+ xml_complete_through m,+ xml_listings m,+ xml_time_stamp m)+++-- | Convert an 'AutoRacingScheduleListingXml' to/from XML.+--+pickle_listing :: PU AutoRacingScheduleListingXml+pickle_listing =+ xpElem "Listing" $+ xpWrap (from_tuple, to_tuple) $+ xp10Tuple (xpElem "RaceID" xpInt)+ (xpElem "Race_Date" xp_date)+ (xpElem "Race_Time" xp_tba_time)+ (xpElem "RaceName" xpText)+ (xpElem "TrackName" xpText)+ (xpElem "Location" xpText)+ (xpElem "TV_Listing" $ xpOption xpText)+ (xpElem "Laps" xpInt)+ (xpElem "TrackLength" xpText)+ (xpList pickle_race_results)+ where+ from_tuple = uncurryN AutoRacingScheduleListingXml+ to_tuple m = (xml_race_id m,+ xml_race_date m,+ xml_race_time m,+ xml_race_name m,+ xml_track_name m,+ xml_location m,+ xml_tv_listing m,+ xml_laps m,+ xml_track_length m,+ xml_race_results m)+++-- | Convert an 'AutoRacingScheduleListingRaceResult' to/from XML.+--+pickle_race_results :: PU AutoRacingScheduleListingRaceResult+pickle_race_results =+ xpElem "RaceResults" $+ xpWrap (to_result, from_result) $+ xpList pickle_race_results_listing+ where+ to_result = AutoRacingScheduleListingRaceResult+ from_result = xml_race_result_listing+++-- | Convert an+-- 'AutoRacingScheduleListingRaceResultRaceResultListingXml' to/from+-- XML.+--+pickle_race_results_listing ::+ PU AutoRacingScheduleListingRaceResultRaceResultListingXml+pickle_race_results_listing =+ xpElem "RaceResultsListing" $+ xpWrap (from_tuple, to_tuple) $+ xp7Tuple (xpElem "FinishPosition" xpInt)+ (xpElem "DriverID" xpInt)+ (xpElem "Name" xpText)+ (xpElem "LeadingLaps" xpInt)+ (xpElem "Laps" xpInt)+ (xpElem "Earnings" xpText)+ (xpElem "Status" xpText)+ where+ from_tuple =+ uncurryN AutoRacingScheduleListingRaceResultRaceResultListingXml++ to_tuple m = (xml_finish_position m,+ xml_driver_id m,+ xml_name m,+ xml_leading_laps m,+ xml_listing_laps m,+ xml_earnings m,+ xml_status m)+++--+-- Tasty Tests+--++-- | A list of all tests for this module.+--+auto_racing_schedule_tests :: TestTree+auto_racing_schedule_tests =+ testGroup+ "AutoRacingSchedule tests"+ [ test_on_delete_cascade,+ test_pickle_of_unpickle_is_identity,+ test_unpickle_succeeds ]++-- | If we unpickle something and then pickle it, we should wind up+-- with the same thing we started with. WARNING: success of this+-- test does not mean that unpickling succeeded.+--+test_pickle_of_unpickle_is_identity :: TestTree+test_pickle_of_unpickle_is_identity = testGroup "pickle-unpickle tests"+ [ check "pickle composed with unpickle is the identity"+ "test/xml/Auto_Racing_Schedule_XML.xml",++ check "pickle composed with unpickle is the identity (miles track length)"+ "test/xml/Auto_Racing_Schedule_XML-miles-track-length.xml" ]+ where+ check desc path = testCase desc $ do+ (expected, actual) <- pickle_unpickle pickle_message path+ actual @?= expected+++-- | Make sure we can actually unpickle these things.+--+test_unpickle_succeeds :: TestTree+test_unpickle_succeeds = testGroup "unpickle tests"+ [ check "unpickling succeeds"+ "test/xml/Auto_Racing_Schedule_XML.xml",++ check "unpickling succeeds (non-int team_id)"+ "test/xml/Auto_Racing_Schedule_XML-miles-track-length.xml" ]+ where+ check desc path = testCase desc $ do+ actual <- unpickleable path pickle_message+ let expected = True+ actual @?= expected+++-- | Make sure everything gets deleted when we delete the top-level+-- record.+--+test_on_delete_cascade :: TestTree+test_on_delete_cascade = testGroup "cascading delete tests"+ [ check "deleting auto_racing_schedules deletes its children"+ "test/xml/Auto_Racing_Schedule_XML.xml" ,++ check ("deleting auto_racing_schedules deletes its children " +++ "(miles track length)")+ "test/xml/Auto_Racing_Schedule_XML-miles-track-length.xml" ]+ where+ check desc path = testCase desc $ do+ sched <- unsafe_unpickle path pickle_message+ let a = undefined :: AutoRacingSchedule+ let b = undefined :: AutoRacingScheduleListing+ let c = undefined :: AutoRacingScheduleListingRaceResultRaceResultListing++ actual <- withSqliteConn ":memory:" $ runDbConn $ do+ runMigration silentMigrationLogger $ do+ migrate a+ migrate b+ migrate c+ _ <- dbimport sched+ -- No idea how 'delete' works, so do this instead.+ executeRaw False "DELETE FROM auto_racing_schedules;" []+ count_a <- countAll a+ count_b <- countAll b+ count_c <- countAll c+ return $ sum [count_a, count_b, count_c]+ let expected = 0+ actual @?= expected
src/TSN/XML/Heartbeat.hs view
@@ -3,6 +3,7 @@ -- | Handle documents defined by Heartbeat.dtd. -- module TSN.XML.Heartbeat (+ dtd, verify, -- * Tests heartbeat_tests )@@ -26,6 +27,11 @@ import TSN.DbImport ( ImportResult(..) ) import Xml ( pickle_unpickle, unpickleable ) ++-- | The DTD to which this module corresponds.+--+dtd :: String+dtd = "Heartbeat.dtd" -- | The data structure that holds the XML representation of a -- Heartbeat message.
src/TSN/XML/Injuries.hs view
@@ -17,6 +17,7 @@ -- time_stamp. -- module TSN.XML.Injuries (+ dtd, pickle_message, -- * Tests injuries_tests,@@ -71,6 +72,12 @@ unpickleable, unsafe_unpickle ) +++-- | The DTD to which this module corresponds. Used to invoke dbimport.+--+dtd :: String+dtd = "injuriesxml.dtd" -- -- DB/XML Data types
src/TSN/XML/InjuriesDetail.hs view
@@ -13,6 +13,7 @@ -- real meat. -- module TSN.XML.InjuriesDetail (+ dtd, pickle_message, -- * Tests injuries_detail_tests,@@ -65,6 +66,13 @@ pickle_unpickle, unpickleable, unsafe_unpickle )++++-- | The DTD to which this module corresponds. Used to invoke dbimport.+--+dtd :: String+dtd = "Injuries_Detail_XML.dtd" --
src/TSN/XML/News.hs view
@@ -11,6 +11,7 @@ -- a root element \<message\> that contains an entire news item. -- module TSN.XML.News (+ dtd, pickle_message, -- * Tests news_tests,@@ -73,7 +74,13 @@ unsafe_unpickle ) +-- | The DTD to which this module corresponds. Used to invoke dbimport. --+dtd :: String+dtd = "newsxml.dtd"+++-- -- DB/XML Data types -- @@ -272,7 +279,6 @@ -- use our own codegen to peel those off before naming the columns. mkPersist tsn_codegen_config [groundhog| - entity: News- dbName: news constructors: - name: News uniques:
src/TSN/XML/Odds.hs view
@@ -12,6 +12,7 @@ -- other... disorganized... information. -- module TSN.XML.Odds (+ dtd, pickle_message, -- * Tests odds_tests,@@ -77,7 +78,13 @@ unsafe_unpickle ) +-- | The DTD to which this module corresponds. Used to invoke dbimport. --+dtd :: String+dtd = "Odds_XML.dtd"+++-- -- DB/XML data types -- @@ -793,12 +800,12 @@ -- test_on_delete_cascade :: TestTree test_on_delete_cascade = testGroup "cascading delete tests"- [ check "deleting odds deleted its children"+ [ check "deleting odds deletes its children" "test/xml/Odds_XML.xml" 13 -- 5 casinos, 8 teams , - check "deleting odds deleted its children (non-int team_id)"+ check "deleting odds deletes its children (non-int team_id)" "test/xml/Odds_XML-noninteger-team-id.xml" 51 -- 5 casinos, 46 teams ,
+ src/TSN/XML/Scores.hs view
@@ -0,0 +1,630 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}++-- | Parse TSN XML for the DTD \"scoresxml.dtd\". Each document+-- contains a single \<game\> and some \<location\>s.+--+module TSN.XML.Scores (+ dtd,+ pickle_message,+ -- * Tests+ scores_tests,+ -- * WARNING: these are private but exported to silence warnings+ Score_ScoreLocationConstructor(..),+ ScoreConstructor(..),+ ScoreGameConstructor(..),+ ScoreGameTeamConstructor(..),+ ScoreLocationConstructor(..),+ ScoreGame_ScoreGameTeamConstructor(..) )+where++-- System imports.+import Data.Data ( Data )+import Data.Time ( UTCTime )+import Data.Tuple.Curry ( uncurryN )+import Data.Typeable ( Typeable )+import Database.Groundhog (+ countAll,+ executeRaw,+ insert,+ insert_,+ migrate,+ runMigration,+ silentMigrationLogger )+import Database.Groundhog.Core ( DefaultKey )+import Database.Groundhog.Generic ( runDbConn )+import Database.Groundhog.Sqlite ( withSqliteConn )+import Database.Groundhog.TH (+ defaultCodegenConfig,+ groundhog,+ mkPersist )+import Test.Tasty ( TestTree, testGroup )+import Test.Tasty.HUnit ( (@?=), testCase )+import Text.XML.HXT.Core (+ PU,+ xp7Tuple,+ xp11Tuple,+ xpAttr,+ xpElem,+ xpInt,+ xpList,+ xpOption,+ xpPair,+ xpPrim,+ xpText,+ xpTriple,+ xpWrap )++-- Local imports.+import TSN.Codegen (+ tsn_codegen_config )+import TSN.DbImport ( DbImport(..), ImportResult(..), run_dbmigrate )+import TSN.Picklers ( xp_time_stamp )+import TSN.XmlImport ( XmlImport(..), XmlImportFk(..) )+import Xml (+ FromXml(..),+ FromXmlFk(..),+ ToDb(..),+ pickle_unpickle,+ unpickleable,+ unsafe_unpickle )+++-- | The DTD to which this module corresponds. Used to invoke dbimport.+--+dtd :: String+dtd = "scoresxml.dtd"+++---+--- DB/XML Data types+---+++-- * Score / Message++-- | Database representation of a 'Message'. It lacks the+-- 'xml_locations' and 'xml_game' which are related via foreign keys+-- instead.+--+data Score =+ Score {+ db_xml_file_id :: Int,+ db_heading :: String,+ db_game_id :: Int,+ db_schedule_id :: Int,+ db_tsnupdate :: Maybe Bool,+ db_category :: String,+ db_sport :: String,+ db_season_type :: String,+ db_time_stamp :: UTCTime }+++-- | XML representation of the top level \<message\> element (i.e. a+-- 'Score').+--+data Message =+ Message {+ xml_xml_file_id :: Int,+ xml_heading :: String,+ xml_game_id :: Int,+ xml_schedule_id :: Int,+ xml_tsnupdate :: Maybe Bool,+ xml_category :: String,+ xml_sport :: String,+ xml_locations :: [ScoreLocation],+ xml_season_type :: String,+ xml_game :: ScoreGameXml,+ xml_time_stamp :: UTCTime }+ deriving (Eq, Show)++instance ToDb Message where+ -- | The database representation of a 'Message' is a 'Score'.+ type Db Message = Score++instance FromXml Message where+ from_xml Message{..} =+ Score {+ db_xml_file_id = xml_xml_file_id,+ db_heading = xml_heading,+ db_game_id = xml_game_id,+ db_schedule_id = xml_schedule_id,+ db_tsnupdate = xml_tsnupdate,+ db_category = xml_category,+ db_sport = xml_sport,+ db_season_type = xml_season_type,+ db_time_stamp = xml_time_stamp }+++-- | This lets us insert the XML representation 'Message' directly.+--+instance XmlImport Message+++-- * ScoreGame / ScoreGameXml++-- | This is an embedded field within 'SportsGame'. Each \<status\>+-- element has two attributes, a numeral and a type. It also+-- contains some text. Rather than put these in their own table, we+-- include them in the parent 'SportsGame'.+--+data ScoreGameStatus =+ ScoreGameStatus {+ db_status_numeral :: Int,+ db_status_type :: String, -- ^ These are probably only one-character long,+ -- but they all take the same amount of space+ -- in Postgres.+ db_status_text :: String }+ deriving (Data, Eq, Show, Typeable)+++-- | Database representation of a game.+--+data ScoreGame =+ ScoreGame {+ db_scores_id :: DefaultKey Score,+ db_vscore :: Int,+ db_hscore :: Int,+ db_time_r :: Maybe String, -- ^ Time remaining, the format is uncertain.+ db_status :: ScoreGameStatus,+ db_notes :: Maybe String }+++-- | XML representation of a \<game\> element (i.e. a 'ScoreGame').+--+data ScoreGameXml =+ ScoreGameXml {+ xml_vteam :: ScoreGameVTeam,+ xml_hteam :: ScoreGameHTeam,+ xml_vscore :: Int,+ xml_hscore :: Int,+ xml_time_r :: Maybe String, -- ^ Time remaining, the format is uncertain.+ xml_status :: ScoreGameStatus,+ xml_notes :: Maybe String }+ deriving (Eq, Show)++-- | Pseudo-accessor to get the 'ScoreGameTeam' out of 'xml_vteam'.+vteam :: ScoreGameXml -> ScoreGameTeam+vteam g = let (ScoreGameVTeam t) = xml_vteam g in t++-- | Pseudo-accessor to get the 'ScoreGameTeam' out of 'xml_hteam'.+hteam :: ScoreGameXml -> ScoreGameTeam+hteam g = let (ScoreGameHTeam t) = xml_hteam g in t++instance ToDb ScoreGameXml where+ -- | The database representation of a 'ScoreGameXml' is a+ -- 'ScoreGame'.+ --+ type Db ScoreGameXml = ScoreGame++instance FromXmlFk ScoreGameXml where+ -- | Each 'ScoreGameXml' is contained in (i.e. has a foreign key to)+ -- a 'Score'.+ --+ type Parent ScoreGameXml = Score++ from_xml_fk fk ScoreGameXml{..} =+ ScoreGame {+ db_scores_id = fk,+ db_vscore = xml_vscore,+ db_hscore = xml_hscore,+ db_time_r = xml_time_r,+ db_status = xml_status,+ db_notes = xml_notes }++-- | This lets us import the database representation 'ScoreGameXml'+-- directly.+--+instance XmlImportFk ScoreGameXml+++-- * ScoreGameTeam++-- | A team that appears in a 'ScoreGame'. This is meant to represent+-- both home and away teams.+--+data ScoreGameTeam =+ ScoreGameTeam {+ team_id :: String,+ team_name :: String }+ deriving (Eq, Show)++-- | A wrapper around 'ScoreGameTeam' that lets us distinguish between+-- home and away teams. See also 'ScoreGameHTeam'.+--+newtype ScoreGameVTeam =+ ScoreGameVTeam ScoreGameTeam+ deriving (Eq, Show)+++-- | A wrapper around 'ScoreGameTeam' that lets us distinguish between+-- home and away teams. See also 'ScoreGameVTeam'.+--+newtype ScoreGameHTeam =+ ScoreGameHTeam ScoreGameTeam+ deriving (Eq, Show)+++-- * ScoreGame_ScoreGameTeam++-- | Join a 'ScoreGame' with its home/away teams. Database-only. We+-- use a join table because the teams are kept unique.+--+data ScoreGame_ScoreGameTeam =+ ScoreGame_ScoreGameTeam+ (DefaultKey ScoreGame) -- ^ game id+ (DefaultKey ScoreGameTeam) -- ^ vteam id+ (DefaultKey ScoreGameTeam) -- ^ hteam id+++-- * ScoreLocation++-- | Database and XML representation of a \<location\>. This is almost+-- identical to 'TSN.XML.NewsLocation', but the city/state have not+-- appeared optional here so far.+--+data ScoreLocation =+ ScoreLocation {+ city :: String,+ state :: String,+ country :: String }+ deriving (Eq, Show)+++-- * Score_ScoreLocation++-- | Join each 'Score' with its 'ScoreLocation's. Database-only. We+-- use a join table because the locations are kept unique.+--+data Score_ScoreLocation =+ Score_ScoreLocation+ (DefaultKey Score)+ (DefaultKey ScoreLocation)++++instance DbImport Message where+ dbmigrate _ =+ run_dbmigrate $ do+ migrate (undefined :: Score)+ migrate (undefined :: ScoreGame)+ migrate (undefined :: ScoreGameTeam)+ migrate (undefined :: ScoreGame_ScoreGameTeam)+ migrate (undefined :: ScoreLocation)+ migrate (undefined :: Score_ScoreLocation)++ dbimport m = do+ -- Insert the message and get its ID.+ msg_id <- insert_xml m++ -- Insert all of the locations contained within this message and+ -- collect their IDs in a list.+ location_ids <- mapM insert (xml_locations m)++ -- Now use that list to construct 'Score_ScoreLocation' objects,+ -- and insert them.+ mapM_ (insert_ . Score_ScoreLocation msg_id) location_ids++ -- Insert the game and its hteam/vteam, noting the IDs.+ game_id <- insert_xml_fk msg_id (xml_game m)+ vteam_id <- insert (vteam $ xml_game m)+ hteam_id <- insert (hteam $ xml_game m)++ -- Finally add a 'ScoreGame_ScoreGameTeam' mapping the+ -- aforementioned game to its hteam/vteam.+ insert_ $ ScoreGame_ScoreGameTeam game_id vteam_id hteam_id++ return ImportSucceeded+++-- These types don't have special XML representations or field name+-- collisions so we use the defaultCodegenConfig and give their+-- fields nice simple names.+mkPersist defaultCodegenConfig [groundhog|+- entity: ScoreGameTeam+ dbName: scores_games_teams+ constructors:+ - name: ScoreGameTeam+ uniques:+ - name: unique_scores_games_team+ type: constraint+ fields: [team_id]++- entity: ScoreLocation+ dbName: scores_locations+ constructors:+ - name: ScoreLocation+ uniques:+ - name: unique_scores_location+ type: constraint+ fields: [city, state, country]++|]++++-- These types have fields with e.g. db_ and xml_ prefixes, so we+-- use our own codegen to peel those off before naming the columns.+mkPersist tsn_codegen_config [groundhog|+- entity: Score+ dbName: scores+ constructors:+ - name: Score+ uniques:+ - name: unique_scores+ type: constraint+ # Prevent multiple imports of the same message.+ fields: [db_xml_file_id]++- embedded: ScoreGameStatus+ fields:+ - name: db_status_numeral+ dbName: status_numeral+ - name: db_status_type+ dbName: status_type+ - name: db_status_text+ dbName: status_text++- entity: ScoreGame+ dbName: scores_games+ constructors:+ - name: ScoreGame+ fields:+ - name: db_scores_id+ reference:+ onDelete: cascade+ - name: db_status+ embeddedType:+ - { name: status_numeral, dbName: status_numeral }+ - { name: status_type, dbName: status_type }+ - { name: status_text, dbName: status_text }++- entity: ScoreGame_ScoreGameTeam+ dbName: scores_games__scores_games_teams+ constructors:+ - name: ScoreGame_ScoreGameTeam+ fields:+ - name: scoreGame_ScoreGameTeam0 # Default created by mkNormalFieldName+ dbName: scores_games_id+ reference:+ onDelete: cascade+ - name: scoreGame_ScoreGameTeam1 # Default created by mkNormalFieldName+ dbName: scores_games_teams_vteam_id+ reference:+ onDelete: cascade+ - name: scoreGame_ScoreGameTeam2 # Default created by mkNormalFieldName+ dbName: scores_games_teams_hteam_id+ reference:+ onDelete: cascade++- entity: Score_ScoreLocation+ dbName: scores__scores_locations+ constructors:+ - name: Score_ScoreLocation+ fields:+ - name: score_ScoreLocation0 # Default created by mkNormalFieldName+ dbName: scores_id+ reference:+ onDelete: cascade+ - name: score_ScoreLocation1 # Default created by mkNormalFieldName+ dbName: scores_locations_id+ reference:+ onDelete: cascade+|]+++--+-- Pickling+--++-- | Convert a 'Message' to/from \<message\>.+--+pickle_message :: PU Message+pickle_message =+ xpElem "message" $+ xpWrap (from_tuple, to_tuple) $+ xp11Tuple (xpElem "XML_File_ID" xpInt)+ (xpElem "heading" xpText)+ (xpElem "game_id" xpInt)+ (xpElem "schedule_id" xpInt)+ (xpOption $ xpElem "tsnupdate" xpPrim)+ (xpElem "category" xpText)+ (xpElem "sport" xpText)+ (xpList pickle_location)+ (xpElem "seasontype" xpText)+ pickle_game+ (xpElem "time_stamp" xp_time_stamp)+ where+ from_tuple = uncurryN Message+ to_tuple m = (xml_xml_file_id m,+ xml_heading m,+ xml_game_id m,+ xml_schedule_id m,+ xml_tsnupdate m,+ xml_category m,+ xml_sport m,+ xml_locations m,+ xml_season_type m,+ xml_game m,+ xml_time_stamp m)++++-- | Convert a 'ScoreLocation' to/from \<location\>.+--+pickle_location :: PU ScoreLocation+pickle_location =+ xpElem "location" $+ xpWrap (from_tuple, to_tuple) $+ xpTriple (xpElem "city" xpText)+ (xpElem "state" xpText)+ (xpElem "country" xpText)+ where+ from_tuple =+ uncurryN ScoreLocation+ to_tuple l = (city l, state l, country l)+++-- | Convert a 'ScoreGameStatus' to/from \<status\>.+--+pickle_status :: PU ScoreGameStatus+pickle_status =+ xpElem "status" $+ xpWrap (from_tuple, to_tuple) $+ xpTriple (xpAttr "numeral" xpInt)+ (xpAttr "type" xpText)+ xpText+ where+ from_tuple = uncurryN ScoreGameStatus+ to_tuple ScoreGameStatus{..} = (db_status_numeral,+ db_status_type,+ db_status_text)+++-- | Convert a 'ScoreGameXml' to/from \<game\>.+--+pickle_game :: PU ScoreGameXml+pickle_game =+ xpElem "game" $+ xpWrap (from_tuple, to_tuple) $+ xp7Tuple pickle_vteam+ pickle_hteam+ (xpElem "vscore" xpInt)+ (xpElem "hscore" xpInt)+ (xpOption $ xpElem "time_r" xpText)+ pickle_status+ (xpOption $ xpElem "notes" xpText)+ where+ from_tuple = uncurryN ScoreGameXml+ to_tuple ScoreGameXml{..} = (xml_vteam,+ xml_hteam,+ xml_vscore,+ xml_hscore,+ xml_time_r,+ xml_status,+ xml_notes)+++-- | Convert a 'ScoreGameVTeam' to/from \<vteam\>.+--+pickle_vteam :: PU ScoreGameVTeam+pickle_vteam =+ xpElem "vteam" $+ xpWrap (from_tuple, to_tuple) $+ xpPair (xpAttr "id" xpText)+ xpText+ where+ from_tuple = ScoreGameVTeam . uncurry ScoreGameTeam+ to_tuple (ScoreGameVTeam ScoreGameTeam{..}) = (team_id, team_name)+++-- | Convert a 'ScoreGameVTeam' to/from \<hteam\>. Identical to+-- 'pickle_vteam' modulo the \"h\" and \"v\".+--+pickle_hteam :: PU ScoreGameHTeam+pickle_hteam =+ xpElem "hteam" $+ xpWrap (from_tuple, to_tuple) $+ xpPair (xpAttr "id" xpText)+ xpText+ where+ from_tuple = ScoreGameHTeam . uncurry ScoreGameTeam+ to_tuple (ScoreGameHTeam ScoreGameTeam{..}) = (team_id, team_name)++++---+--- Tasty tests+---++-- | A list of all tests for this module.+--+scores_tests :: TestTree+scores_tests =+ testGroup+ "Scores tests"+ [ test_on_delete_cascade,+ test_pickle_of_unpickle_is_identity,+ test_unpickle_succeeds ]+++-- | If we unpickle something and then pickle it, we should wind up+-- with the same thing we started with. WARNING: success of this+-- test does not mean that unpickling succeeded.+--+test_pickle_of_unpickle_is_identity :: TestTree+test_pickle_of_unpickle_is_identity = testGroup "pickle-unpickle tests"+ [ check "pickle composed with unpickle is the identity"+ "test/xml/scoresxml.xml",++ check "pickle composed with unpickle is the identity (no locations)"+ "test/xml/scoresxml-no-locations.xml" ]+ where+ check desc path = testCase desc $ do+ (expected, actual) <- pickle_unpickle pickle_message path+ actual @?= expected+++-- | Make sure we can actually unpickle these things.+--+test_unpickle_succeeds :: TestTree+test_unpickle_succeeds = testGroup "unpickle tests"+ [ check "unpickling succeeds"+ "test/xml/scoresxml.xml",++ check "unpickling succeeds (no locations)"+ "test/xml/scoresxml-no-locations.xml" ]+ where+ check desc path = testCase desc $ do+ actual <- unpickleable path pickle_message+ let expected = True+ actual @?= expected+++-- | Make sure everything gets deleted when we delete the top-level+-- record.+--+test_on_delete_cascade :: TestTree+test_on_delete_cascade = testGroup "cascading delete tests"+ [ check "unpickling succeeds"+ "test/xml/scoresxml.xml"+ 4, -- 2 teams, 2 locations++ check "unpickling succeeds (no locations)"+ "test/xml/scoresxml-no-locations.xml"+ 2 -- 2 teams, 0 locations+ ]+ where+ check desc path expected = testCase desc $ do+ score <- unsafe_unpickle path pickle_message+ let a = undefined :: Score+ let b = undefined :: ScoreGame+ let c = undefined :: ScoreGameTeam+ let d = undefined :: ScoreGame_ScoreGameTeam+ let e = undefined :: ScoreLocation+ let f = undefined :: Score_ScoreLocation+ actual <- withSqliteConn ":memory:" $ runDbConn $ do+ runMigration silentMigrationLogger $ do+ migrate a+ migrate b+ migrate c+ migrate d+ migrate e+ migrate f+ _ <- dbimport score+ -- No idea how 'delete' works, so do this instead.+ executeRaw False "DELETE FROM scores;" []+ count_a <- countAll a+ count_b <- countAll b+ count_c <- countAll c+ count_d <- countAll d+ count_e <- countAll e+ count_f <- countAll f+ return $ sum [count_a, count_b, count_c,+ count_d, count_e, count_f ]+ actual @?= expected
src/TSN/XML/Weather.hs view
@@ -10,6 +10,7 @@ -- that league contains a bunch of listings. -- module TSN.XML.Weather (+ dtd, pickle_message, -- * Tests weather_tests,@@ -62,6 +63,13 @@ pickle_unpickle, unpickleable, unsafe_unpickle )++++-- | The DTD to which this module corresponds. Used to invoke dbimport.+--+dtd :: String+dtd = "weatherxml.dtd" --
test/TestSuite.hs view
@@ -1,20 +1,24 @@ import Test.Tasty ( TestTree, defaultMain, testGroup ) +import TSN.XML.AutoRacingSchedule ( auto_racing_schedule_tests ) import TSN.XML.Heartbeat ( heartbeat_tests ) import TSN.XML.Injuries ( injuries_tests ) import TSN.XML.InjuriesDetail ( injuries_detail_tests ) import TSN.XML.News ( news_tests ) import TSN.XML.Odds ( odds_tests )+import TSN.XML.Scores ( scores_tests ) import TSN.XML.Weather ( weather_tests ) tests :: TestTree tests = testGroup "All tests"- [ heartbeat_tests,+ [ auto_racing_schedule_tests,+ heartbeat_tests, injuries_tests, injuries_detail_tests, news_tests, odds_tests,+ scores_tests, weather_tests ] main :: IO ()
test/shell/import-duplicates.test view
@@ -15,15 +15,15 @@ # Heartbeat.xml that doesn't really count. find ./test/xml -name '*.xml' | wc -l >>>-12+16 >>>= 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*11+# xml_file_ids. There are 2 errors for each violation, so we expect 2*15 # occurrences of the string 'ERROR'. ./dist/build/htsn-import/htsn-import -c 'shelltest.sqlite3' test/xml/*.xml 2>&1 | grep ERROR | wc -l >>>-22+30 >>>= 0 # Finally, clean up after ourselves.
+ test/xml/Auto_Racing_Schedule_XML-miles-track-length.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?> <!DOCTYPE message PUBLIC "-//TSN//DTD Leader 1.0/EN" "Auto_Racing_Schedule_XML.dtd"> <message> <XML_File_ID>20136765</XML_File_ID> <heading>ATX%SCHEDULE</heading> <category>Statistics</category> <sport>NASCAR-T</sport> <Title>2014 Camping World Series Schedule</Title> <Complete_Through>Complete through </Complete_Through> <Listing> <RaceID>1739</RaceID> <Race_Date>02/21/2014</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>NextEra Energy Resources 250</RaceName> <TrackName>Daytona International Speedway</TrackName> <Location>Daytona Beach, FL</Location> <TV_Listing>FS1</TV_Listing> <Laps>100</Laps> <TrackLength>2.5</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1740</RaceID> <Race_Date>03/29/2014</Race_Date> <Race_Time>01:30 PM</Race_Time> <RaceName>Kroger 250</RaceName> <TrackName>Martinsville Speedway</TrackName> <Location>Martinsville, VA</Location> <TV_Listing>FS1</TV_Listing> <Laps>250</Laps> <TrackLength>0.526</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1741</RaceID> <Race_Date>05/09/2014</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>SFP 250</RaceName> <TrackName>Kansas Speedway</TrackName> <Location>Kansas City, KS</Location> <TV_Listing>FS1</TV_Listing> <Laps>167</Laps> <TrackLength>1.5</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1742</RaceID> <Race_Date>05/16/2014</Race_Date> <Race_Time>08:00 PM</Race_Time> <RaceName>North Carolina Education Lottery 200</RaceName> <TrackName>Charlotte Motor Speedway</TrackName> <Location>Concord, NC</Location> <TV_Listing>FS1</TV_Listing> <Laps>134</Laps> <TrackLength>1.5</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1743</RaceID> <Race_Date>05/30/2014</Race_Date> <Race_Time>05:00 PM</Race_Time> <RaceName>Lucas Oil 200</RaceName> <TrackName>Dover International Speedway</TrackName> <Location>Dover, DE</Location> <TV_Listing>FS1</TV_Listing> <Laps>200</Laps> <TrackLength>1.0</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1744</RaceID> <Race_Date>06/06/2014</Race_Date> <Race_Time>09:00 PM</Race_Time> <RaceName>WinStar World Casino 400</RaceName> <TrackName>Texas Motor Speedway</TrackName> <Location>Fort Worth, TX</Location> <TV_Listing>FS1</TV_Listing> <Laps>167</Laps> <TrackLength>1.5</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1759</RaceID> <Race_Date>06/14/2014</Race_Date> <Race_Time>09:00 PM</Race_Time> <RaceName>Gateway 200</RaceName> <TrackName>Gateway Motorsports Park</TrackName> <Location>Madison, IL</Location> <TV_Listing>FS1</TV_Listing> <Laps>160</Laps> <TrackLength>1.25 miles</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1745</RaceID> <Race_Date>06/26/2014</Race_Date> <Race_Time>08:00 PM</Race_Time> <RaceName>UNOH 225</RaceName> <TrackName>Kentucky Speedway</TrackName> <Location>Sparta, KY</Location> <TV_Listing>FS1</TV_Listing> <Laps>150</Laps> <TrackLength>1.5</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1746</RaceID> <Race_Date>07/11/2014</Race_Date> <Race_Time>08:30 PM</Race_Time> <RaceName>American Ethanol 200</RaceName> <TrackName>Iowa Speedway</TrackName> <Location>Newton, IA</Location> <TV_Listing>FS1</TV_Listing> <Laps>200</Laps> <TrackLength>0.875</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1747</RaceID> <Race_Date>07/23/2014</Race_Date> <Race_Time>09:35 PM</Race_Time> <RaceName>Mudsummer Classic</RaceName> <TrackName>Eldora Speedway</TrackName> <Location>Rossburg, OH</Location> <TV_Listing>FS1</TV_Listing> <Laps>153</Laps> <TrackLength>0.5</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1748</RaceID> <Race_Date>08/02/2014</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Pocono Mountains 125</RaceName> <TrackName>Pocono Raceway</TrackName> <Location>Long Pond, PA</Location> <TV_Listing>FS1</TV_Listing> <Laps>54</Laps> <TrackLength>2.5</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1749</RaceID> <Race_Date>08/16/2014</Race_Date> <Race_Time>12:30 PM</Race_Time> <RaceName>Michigan National Guard 200</RaceName> <TrackName>Michigan International Speedway</TrackName> <Location>Brooklyn, MI</Location> <TV_Listing>FS1</TV_Listing> <Laps>100</Laps> <TrackLength>2.0</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1750</RaceID> <Race_Date>08/20/2014</Race_Date> <Race_Time>08:00 PM</Race_Time> <RaceName>UNOH 200</RaceName> <TrackName>Bristol Motor Speedway</TrackName> <Location>Bristol, TN</Location> <TV_Listing>FS1</TV_Listing> <Laps>200</Laps> <TrackLength>0.533</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1751</RaceID> <Race_Date>08/31/2014</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>Chevrolet Silverado 250</RaceName> <TrackName>Canadian Tire Motorsport Park</TrackName> <Location>Bowmanville, ON, Canada</Location> <TV_Listing>FS1</TV_Listing> <Laps>64</Laps> <TrackLength>2.459</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1752</RaceID> <Race_Date>09/12/2014</Race_Date> <Race_Time>08:30 PM</Race_Time> <RaceName>EnjoyIllinois.com 225</RaceName> <TrackName>Chicagoland Speedway</TrackName> <Location>Joliet, IL</Location> <TV_Listing>FS1</TV_Listing> <Laps>150</Laps> <TrackLength>1.5</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1760</RaceID> <Race_Date>09/20/2014</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>Camping World Truck Series 200</RaceName> <TrackName>New Hampshire Motor Speedway</TrackName> <Location>Loudon, NH</Location> <TV_Listing>FS1</TV_Listing> <Laps>175</Laps> <TrackLength>1.058</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1753</RaceID> <Race_Date>09/27/2014</Race_Date> <Race_Time>08:30 PM</Race_Time> <RaceName>Smith's 350</RaceName> <TrackName>Las Vegas Motor Speedway</TrackName> <Location>Las Vegas, NV</Location> <TV_Listing>FS1</TV_Listing> <Laps>146</Laps> <TrackLength>1.5</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1754</RaceID> <Race_Date>10/18/2014</Race_Date> <Race_Time>04:00 PM</Race_Time> <RaceName>Fred's 250</RaceName> <TrackName>Talladega Superspeedway</TrackName> <Location>Talladega, AL</Location> <TV_Listing>FS1</TV_Listing> <Laps>94</Laps> <TrackLength>2.66</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1755</RaceID> <Race_Date>10/25/2014</Race_Date> <Race_Time>01:30 PM</Race_Time> <RaceName>Kroger 200</RaceName> <TrackName>Martinsville Speedway</TrackName> <Location>Martinsville, VA</Location> <TV_Listing>FS1</TV_Listing> <Laps>200</Laps> <TrackLength>0.526</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1756</RaceID> <Race_Date>10/31/2014</Race_Date> <Race_Time>08:30 PM</Race_Time> <RaceName>WinStar World Casino 350</RaceName> <TrackName>Texas Motor Speedway</TrackName> <Location>Fort Worth, TX</Location> <TV_Listing>FS1</TV_Listing> <Laps>147</Laps> <TrackLength>1.5</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1757</RaceID> <Race_Date>11/07/2014</Race_Date> <Race_Time>08:00 PM</Race_Time> <RaceName>Lucas Oil 150</RaceName> <TrackName>Phoenix International Raceway</TrackName> <Location>Avondale, AZ</Location> <TV_Listing>FS1</TV_Listing> <Laps>150</Laps> <TrackLength>1.0</TrackLength> <RaceResults> </RaceResults> </Listing> <Listing> <RaceID>1758</RaceID> <Race_Date>11/14/2014</Race_Date> <Race_Time>08:00 PM</Race_Time> <RaceName>Ford EcoBoost 200</RaceName> <TrackName>Homestead-Miami Speedway</TrackName> <Location>Homestead, FL</Location> <TV_Listing>FS1</TV_Listing> <Laps>148</Laps> <TrackLength>1.5</TrackLength> <RaceResults> </RaceResults> </Listing> <time_stamp> January 13, 2014, at 12:04 PM ET </time_stamp> </message>
+ test/xml/Auto_Racing_Schedule_XML.dtd view
@@ -0,0 +1,26 @@+<!ELEMENT XML_File_ID (#PCDATA)>+<!ELEMENT heading (#PCDATA)>+<!ELEMENT category (#PCDATA)>+<!ELEMENT sport (#PCDATA)>+<!ELEMENT Title (#PCDATA)>+<!ELEMENT Complete_Through (#PCDATA)>+<!ELEMENT RaceID (#PCDATA)>+<!ELEMENT Race_Date (#PCDATA)>+<!ELEMENT Race_Time (#PCDATA)>+<!ELEMENT RaceName (#PCDATA)>+<!ELEMENT TrackName (#PCDATA)>+<!ELEMENT Location (#PCDATA)>+<!ELEMENT TV_Listing (#PCDATA)>+<!ELEMENT Laps (#PCDATA)>+<!ELEMENT TrackLength (#PCDATA)>+<!ELEMENT FinishPosition (#PCDATA)>+<!ELEMENT DriverID (#PCDATA)>+<!ELEMENT Name (#PCDATA)>+<!ELEMENT LeadingLaps (#PCDATA)>+<!ELEMENT Earnings (#PCDATA)>+<!ELEMENT Status (#PCDATA)>+<!ELEMENT RaceResultsListing ( ( FinishPosition, DriverID, Name, LeadingLaps, Laps, Earnings, Status ) )>+<!ELEMENT RaceResults ( RaceResultsListing* )>+<!ELEMENT Listing ( ( RaceID, Race_Date, Race_Time, RaceName, TrackName, Location, TV_Listing, Laps, TrackLength, RaceResults ) )>+<!ELEMENT time_stamp (#PCDATA)>+<!ELEMENT message ( ( XML_File_ID, heading, category, sport, Title, Complete_Through, Listing*, time_stamp ) )>
+ test/xml/Auto_Racing_Schedule_XML.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?> <!DOCTYPE message PUBLIC "-//TSN//DTD Leader 1.0/EN" "Auto_Racing_Schedule_XML.dtd"> <message> <XML_File_ID>20136714</XML_File_ID> <heading>BFX%SCHEDULE</heading> <category>Statistics</category> <sport>NASCAR</sport> <Title>2013 NASCAR Sprint Cup Schedule</Title> <Complete_Through>Complete through </Complete_Through> <Listing> <RaceID>1492</RaceID> <Race_Date>02/16/2013</Race_Date> <Race_Time>08:10 PM</Race_Time> <RaceName>Sprint Unlimited at Daytona</RaceName> <TrackName>Daytona International Speedway</TrackName> <Location>Daytona Beach, FL</Location> <TV_Listing>FOX</TV_Listing> <Laps>75</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>40</LeadingLaps> <Laps>75</Laps> <Earnings>205,075</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>49</DriverID> <Name>Greg Biffle</Name> <LeadingLaps>2</LeadingLaps> <Laps>75</Laps> <Earnings>101,325</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>0</LeadingLaps> <Laps>75</Laps> <Earnings>61,325</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>43</DriverID> <Name>Tony Stewart</Name> <LeadingLaps>5</LeadingLaps> <Laps>75</Laps> <Earnings>52,325</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>26</LeadingLaps> <Laps>75</Laps> <Earnings>51,300</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1493</RaceID> <Race_Date>02/21/2013</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>Budweiser Duel 1</RaceName> <TrackName>Daytona International Speedway</TrackName> <Location>Daytona Beach, FL</Location> <TV_Listing>SPEED</TV_Listing> <Laps>60</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>23</LeadingLaps> <Laps>60</Laps> <Earnings>57,792</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>49</DriverID> <Name>Greg Biffle</Name> <LeadingLaps>0</LeadingLaps> <Laps>60</Laps> <Earnings>42,789</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>59</DriverID> <Name>Juan Pablo Montoya</Name> <LeadingLaps>0</LeadingLaps> <Laps>60</Laps> <Earnings>37,789</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>0</LeadingLaps> <Laps>60</Laps> <Earnings>23,789</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>60</Laps> <Earnings>30,789</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1494</RaceID> <Race_Date>02/21/2013</Race_Date> <Race_Time>04:00 PM</Race_Time> <RaceName>Budweiser Duel 2</RaceName> <TrackName>Daytona International Speedway</TrackName> <Location>Daytona Beach, FL</Location> <TV_Listing>SPEED</TV_Listing> <Laps>60</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>19</LeadingLaps> <Laps>60</Laps> <Earnings>58,977</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>0</LeadingLaps> <Laps>60</Laps> <Earnings>43,963</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>1321</DriverID> <Name>Austin Dillon</Name> <LeadingLaps>0</LeadingLaps> <Laps>60</Laps> <Earnings>38,963</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>1</LeadingLaps> <Laps>60</Laps> <Earnings>33,963</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>0</LeadingLaps> <Laps>60</Laps> <Earnings>31,963</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1495</RaceID> <Race_Date>02/24/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Daytona 500</RaceName> <TrackName>Daytona International Speedway</TrackName> <Location>Daytona Beach, FL</Location> <TV_Listing>FOX</TV_Listing> <Laps>200</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>17</LeadingLaps> <Laps>200</Laps> <Earnings>1,525,275</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>1,104,814</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>32</DriverID> <Name>Mark Martin</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>817,013</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>13</LeadingLaps> <Laps>200</Laps> <Earnings>707,855</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>47</DriverID> <Name>Ryan Newman</Name> <LeadingLaps>3</LeadingLaps> <Laps>200</Laps> <Earnings>578,471</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1496</RaceID> <Race_Date>03/03/2013</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>Subway Fresh Fit 500</RaceName> <TrackName>Phoenix International Raceway</TrackName> <Location>Avondale, AZ</Location> <TV_Listing>FOX</TV_Listing> <Laps>316</Laps> <TrackLength>1.0</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>122</LeadingLaps> <Laps>316</Laps> <Earnings>298,875</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>1</LeadingLaps> <Laps>316</Laps> <Earnings>209,686</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>490</DriverID> <Name>Denny Hamlin</Name> <LeadingLaps>0</LeadingLaps> <Laps>316</Laps> <Earnings>157,575</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>16</LeadingLaps> <Laps>316</Laps> <Earnings>168,076</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>47</LeadingLaps> <Laps>316</Laps> <Earnings>130,750</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1497</RaceID> <Race_Date>03/10/2013</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>Kobalt Tools 400</RaceName> <TrackName>Las Vegas Motor Speedway</TrackName> <Location>Las Vegas, NV</Location> <TV_Listing>FOX</TV_Listing> <Laps>267</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>42</LeadingLaps> <Laps>267</Laps> <Earnings>408,666</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>114</LeadingLaps> <Laps>267</Laps> <Earnings>284,340</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>12</LeadingLaps> <Laps>267</Laps> <Earnings>248,956</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>27</LeadingLaps> <Laps>267</Laps> <Earnings>208,698</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>180,590</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1498</RaceID> <Race_Date>03/17/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Food City 500</RaceName> <TrackName>Bristol Motor Speedway</TrackName> <Location>Bristol, TN</Location> <TV_Listing>FOX</TV_Listing> <Laps>500</Laps> <TrackLength>0.533</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>109</LeadingLaps> <Laps>500</Laps> <Earnings>176,760</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>56</LeadingLaps> <Laps>500</Laps> <Earnings>188,893</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>62</LeadingLaps> <Laps>500</Laps> <Earnings>168,651</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>1</LeadingLaps> <Laps>500</Laps> <Earnings>134,255</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>144,543</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1499</RaceID> <Race_Date>03/24/2013</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>Auto Club 400</RaceName> <TrackName>Auto Club Speedway</TrackName> <Location>Fontana, CA</Location> <TV_Listing>FOX</TV_Listing> <Laps>200</Laps> <TrackLength>2.0</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>125</LeadingLaps> <Laps>200</Laps> <Earnings>334,233</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>212,340</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>41</LeadingLaps> <Laps>200</Laps> <Earnings>193,673</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>181,815</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>146,585</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1500</RaceID> <Race_Date>04/07/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>STP Gas Booster 500</RaceName> <TrackName>Martinsville Speedway</TrackName> <Location>Martinsville, VA</Location> <TV_Listing>FOX</TV_Listing> <Laps>500</Laps> <TrackLength>0.526</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>346</LeadingLaps> <Laps>500</Laps> <Earnings>214,471</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>164,893</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>146,446</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>112,385</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>56</LeadingLaps> <Laps>500</Laps> <Earnings>145,278</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1501</RaceID> <Race_Date>04/13/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>NRA 500</RaceName> <TrackName>Texas Motor Speedway</TrackName> <Location>Fort Worth, TX</Location> <TV_Listing>FOX</TV_Listing> <Laps>334</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>171</LeadingLaps> <Laps>334</Laps> <Earnings>550,858</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>142</LeadingLaps> <Laps>334</Laps> <Earnings>346,555</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>0</LeadingLaps> <Laps>334</Laps> <Earnings>268,605</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>49</DriverID> <Name>Greg Biffle</Name> <LeadingLaps>0</LeadingLaps> <Laps>334</Laps> <Earnings>214,855</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>1</LeadingLaps> <Laps>334</Laps> <Earnings>209,913</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1502</RaceID> <Race_Date>04/21/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>STP 400</RaceName> <TrackName>Kansas Speedway</TrackName> <Location>Kansas City, KS</Location> <TV_Listing>FOX</TV_Listing> <Laps>267</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>163</LeadingLaps> <Laps>267</Laps> <Earnings>263,816</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>182,085</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>9</LeadingLaps> <Laps>267</Laps> <Earnings>185,021</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>46</LeadingLaps> <Laps>267</Laps> <Earnings>155,985</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>156,218</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1503</RaceID> <Race_Date>04/27/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>Toyota Owners 400</RaceName> <TrackName>Richmond International Raceway</TrackName> <Location>Richmond, VA</Location> <TV_Listing>FOX</TV_Listing> <Laps>406</Laps> <TrackLength>0.75</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>3</LeadingLaps> <Laps>406</Laps> <Earnings>242,511</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>113</LeadingLaps> <Laps>406</Laps> <Earnings>196,668</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>0</LeadingLaps> <Laps>406</Laps> <Earnings>161,618</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>59</DriverID> <Name>Juan Pablo Montoya</Name> <LeadingLaps>67</LeadingLaps> <Laps>406</Laps> <Earnings>147,474</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>16</DriverID> <Name>Jeff Burton</Name> <LeadingLaps>7</LeadingLaps> <Laps>406</Laps> <Earnings>118,435</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1504</RaceID> <Race_Date>05/05/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Aaron's 499</RaceName> <TrackName>Talladega Superspeedway</TrackName> <Location>Talladega, AL</Location> <TV_Listing>FOX</TV_Listing> <Laps>192</Laps> <TrackLength>2.66</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>455</DriverID> <Name>David Ragan</Name> <LeadingLaps>4</LeadingLaps> <Laps>192</Laps> <Earnings>373,108</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>399</DriverID> <Name>David Gilliland</Name> <LeadingLaps>0</LeadingLaps> <Laps>192</Laps> <Earnings>235,153</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>5</LeadingLaps> <Laps>192</Laps> <Earnings>207,720</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>46</DriverID> <Name>Michael Waltrip</Name> <LeadingLaps>0</LeadingLaps> <Laps>192</Laps> <Earnings>155,620</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>16</LeadingLaps> <Laps>192</Laps> <Earnings>181,426</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1505</RaceID> <Race_Date>05/11/2013</Race_Date> <Race_Time>07:00 PM</Race_Time> <RaceName>Bojangles Southern 500</RaceName> <TrackName>Darlington Raceway</TrackName> <Location>Darlington, SC</Location> <TV_Listing>FOX</TV_Listing> <Laps>367</Laps> <TrackLength>1.366</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>17</LeadingLaps> <Laps>367</Laps> <Earnings>314,866</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>490</DriverID> <Name>Denny Hamlin</Name> <LeadingLaps>0</LeadingLaps> <Laps>367</Laps> <Earnings>211,465</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>16</LeadingLaps> <Laps>367</Laps> <Earnings>200,026</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>0</LeadingLaps> <Laps>367</Laps> <Earnings>178,876</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>0</LeadingLaps> <Laps>367</Laps> <Earnings>165,976</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1506</RaceID> <Race_Date>05/18/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>Sprint Showdown</RaceName> <TrackName>Charlotte Motor Speedway</TrackName> <Location>Concord, NC</Location> <TV_Listing>SPEED</TV_Listing> <Laps>40</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>34</DriverID> <Name>Jamie McMurray</Name> <LeadingLaps>40</LeadingLaps> <Laps>40</Laps> <Earnings>50,915</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>1341</DriverID> <Name>Ricky Stenhouse Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>40</Laps> <Earnings>40,915</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>16</DriverID> <Name>Jeff Burton</Name> <LeadingLaps>0</LeadingLaps> <Laps>40</Laps> <Earnings>36,640</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>310</DriverID> <Name>Paul Menard</Name> <LeadingLaps>0</LeadingLaps> <Laps>40</Laps> <Earnings>34,540</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>40</Laps> <Earnings>33,540</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1507</RaceID> <Race_Date>05/18/2013</Race_Date> <Race_Time>09:00 PM</Race_Time> <RaceName>NASCAR Sprint All-Star Race</RaceName> <TrackName>Charlotte Motor Speedway</TrackName> <Location>Concord, NC</Location> <TV_Listing>SPEED</TV_Listing> <Laps>90</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>10</LeadingLaps> <Laps>90</Laps> <Earnings>1,039,175</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>0</LeadingLaps> <Laps>90</Laps> <Earnings>244,175</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>29</LeadingLaps> <Laps>90</Laps> <Earnings>144,175</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>11</LeadingLaps> <Laps>90</Laps> <Earnings>114,150</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>29</LeadingLaps> <Laps>90</Laps> <Earnings>109,150</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1508</RaceID> <Race_Date>05/26/2013</Race_Date> <Race_Time>06:00 PM</Race_Time> <RaceName>Coca-Cola 600</RaceName> <TrackName>Charlotte Motor Speedway</TrackName> <Location>Concord, NC</Location> <TV_Listing>FOX</TV_Listing> <Laps>400</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>28</LeadingLaps> <Laps>400</Laps> <Earnings>407,011</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>161</LeadingLaps> <Laps>400</Laps> <Earnings>291,615</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>8</LeadingLaps> <Laps>400</Laps> <Earnings>218,560</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>490</DriverID> <Name>Denny Hamlin</Name> <LeadingLaps>6</LeadingLaps> <Laps>400</Laps> <Earnings>220,915</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>0</LeadingLaps> <Laps>400</Laps> <Earnings>174,823</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1509</RaceID> <Race_Date>06/02/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>FedEx 400</RaceName> <TrackName>Dover International Speedway</TrackName> <Location>Dover, DE</Location> <TV_Listing>FOX</TV_Listing> <Laps>400</Laps> <TrackLength>1.0</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>43</DriverID> <Name>Tony Stewart</Name> <LeadingLaps>139</LeadingLaps> <Laps>400</Laps> <Earnings>318,100</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>59</DriverID> <Name>Juan Pablo Montoya</Name> <LeadingLaps>19</LeadingLaps> <Laps>400</Laps> <Earnings>226,504</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>0</LeadingLaps> <Laps>400</Laps> <Earnings>203,051</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>150</LeadingLaps> <Laps>400</Laps> <Earnings>196,198</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>2</LeadingLaps> <Laps>400</Laps> <Earnings>177,431</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1510</RaceID> <Race_Date>06/09/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Party in the Poconos 400</RaceName> <TrackName>Pocono Raceway</TrackName> <Location>Long Pond, PA</Location> <TV_Listing>TNT</TV_Listing> <Laps>160</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>128</LeadingLaps> <Laps>160</Laps> <Earnings>244,436</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>49</DriverID> <Name>Greg Biffle</Name> <LeadingLaps>0</LeadingLaps> <Laps>160</Laps> <Earnings>179,185</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>160</Laps> <Earnings>143,060</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>43</DriverID> <Name>Tony Stewart</Name> <LeadingLaps>0</LeadingLaps> <Laps>160</Laps> <Earnings>165,810</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>47</DriverID> <Name>Ryan Newman</Name> <LeadingLaps>19</LeadingLaps> <Laps>160</Laps> <Earnings>144,343</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1511</RaceID> <Race_Date>06/16/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Quicken Loans 400</RaceName> <TrackName>Michigan International Speedway</TrackName> <Location>Brooklyn, MI</Location> <TV_Listing>TNT</TV_Listing> <Laps>200</Laps> <TrackLength>2.0</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>49</DriverID> <Name>Greg Biffle</Name> <LeadingLaps>48</LeadingLaps> <Laps>200</Laps> <Earnings>240,460</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>173,781</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>145,670</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>148,803</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>43</DriverID> <Name>Tony Stewart</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>142,085</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1513</RaceID> <Race_Date>06/23/2013</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>Toyota/Save Mart 350</RaceName> <TrackName>Sonoma Raceway</TrackName> <Location>Sonoma, CA</Location> <TV_Listing>TNT</TV_Listing> <Laps>110</Laps> <TrackLength>1.99</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>51</LeadingLaps> <Laps>110</Laps> <Earnings>309,250</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>4</LeadingLaps> <Laps>110</Laps> <Earnings>240,451</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>0</LeadingLaps> <Laps>110</Laps> <Earnings>198,140</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>15</LeadingLaps> <Laps>110</Laps> <Earnings>154,860</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>110</Laps> <Earnings>157,548</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1514</RaceID> <Race_Date>06/30/2013</Race_Date> <Race_Time>12:00 PM</Race_Time> <RaceName>Quaker State 400</RaceName> <TrackName>Kentucky Speedway</TrackName> <Location>Sparta, KY</Location> <TV_Listing>TNT</TV_Listing> <Laps>267</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>38</LeadingLaps> <Laps>267</Laps> <Earnings>200,451</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>34</DriverID> <Name>Jamie McMurray</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>159,115</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>146,078</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>130,338</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>139,743</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1515</RaceID> <Race_Date>07/06/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>Coke Zero 400</RaceName> <TrackName>Daytona International Speedway</TrackName> <Location>Daytona Beach, FL</Location> <TV_Listing>TNT</TV_Listing> <Laps>161</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>94</LeadingLaps> <Laps>161</Laps> <Earnings>327,961</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>43</DriverID> <Name>Tony Stewart</Name> <LeadingLaps>0</LeadingLaps> <Laps>161</Laps> <Earnings>254,490</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>0</LeadingLaps> <Laps>161</Laps> <Earnings>224,301</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>161</Laps> <Earnings>182,073</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>46</DriverID> <Name>Michael Waltrip</Name> <LeadingLaps>0</LeadingLaps> <Laps>161</Laps> <Earnings>141,365</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1516</RaceID> <Race_Date>07/14/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Camping World RV Sales 301</RaceName> <TrackName>New Hampshire Motor Speedway</TrackName> <Location>Loudon, NH</Location> <TV_Listing>TNT</TV_Listing> <Laps>302</Laps> <TrackLength>1.058</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>118</DriverID> <Name>Brian Vickers</Name> <LeadingLaps>16</LeadingLaps> <Laps>302</Laps> <Earnings>214,075</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>53</LeadingLaps> <Laps>302</Laps> <Earnings>228,043</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>16</DriverID> <Name>Jeff Burton</Name> <LeadingLaps>0</LeadingLaps> <Laps>302</Laps> <Earnings>147,135</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>14</LeadingLaps> <Laps>302</Laps> <Earnings>179,076</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>580</DriverID> <Name>Aric Almirola</Name> <LeadingLaps>0</LeadingLaps> <Laps>302</Laps> <Earnings>152,496</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1517</RaceID> <Race_Date>07/28/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Crown Royal 400 at the Brickyard</RaceName> <TrackName>Indianapolis Motor Speedway</TrackName> <Location>Indianapolis, IN</Location> <TV_Listing>ESPN</TV_Listing> <Laps>160</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>47</DriverID> <Name>Ryan Newman</Name> <LeadingLaps>45</LeadingLaps> <Laps>160</Laps> <Earnings>423,033</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>73</LeadingLaps> <Laps>160</Laps> <Earnings>379,736</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>0</LeadingLaps> <Laps>160</Laps> <Earnings>299,500</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>43</DriverID> <Name>Tony Stewart</Name> <LeadingLaps>0</LeadingLaps> <Laps>160</Laps> <Earnings>300,650</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>0</LeadingLaps> <Laps>160</Laps> <Earnings>273,266</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1518</RaceID> <Race_Date>08/04/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>GoBowling.com 400</RaceName> <TrackName>Pocono Raceway</TrackName> <Location>Long Pond, PA</Location> <TV_Listing>ESPN</TV_Listing> <Laps>160</Laps> <TrackLength>2.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>66</LeadingLaps> <Laps>160</Laps> <Earnings>208,500</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>7</LeadingLaps> <Laps>160</Laps> <Earnings>199,221</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>9</LeadingLaps> <Laps>160</Laps> <Earnings>153,930</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>47</DriverID> <Name>Ryan Newman</Name> <LeadingLaps>2</LeadingLaps> <Laps>160</Laps> <Earnings>161,343</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>2</LeadingLaps> <Laps>160</Laps> <Earnings>130,585</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1519</RaceID> <Race_Date>08/11/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Cheez-It 355 at the Glen</RaceName> <TrackName>Watkins Glen International</TrackName> <Location>Watkins Glen, NY</Location> <TV_Listing>ESPN</TV_Listing> <Laps>90</Laps> <TrackLength>2.45</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>29</LeadingLaps> <Laps>90</Laps> <Earnings>236,658</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>0</LeadingLaps> <Laps>90</Laps> <Earnings>204,876</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>90</Laps> <Earnings>161,735</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>0</LeadingLaps> <Laps>90</Laps> <Earnings>149,360</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>59</DriverID> <Name>Juan Pablo Montoya</Name> <LeadingLaps>1</LeadingLaps> <Laps>90</Laps> <Earnings>137,524</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1520</RaceID> <Race_Date>08/18/2013</Race_Date> <Race_Time>01:00 PM</Race_Time> <RaceName>Pure Michigan 400</RaceName> <TrackName>Michigan International Speedway</TrackName> <Location>Brooklyn, MI</Location> <TV_Listing>ESPN</TV_Listing> <Laps>200</Laps> <TrackLength>2.0</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>51</LeadingLaps> <Laps>200</Laps> <Earnings>252,393</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>180,731</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>43</LeadingLaps> <Laps>200</Laps> <Earnings>136,315</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>310</DriverID> <Name>Paul Menard</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>143,486</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>200</Laps> <Earnings>145,493</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1521</RaceID> <Race_Date>08/24/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>IRWIN Tools Night Race</RaceName> <TrackName>Bristol Motor Speedway</TrackName> <Location>Bristol, TN</Location> <TV_Listing>ABC</TV_Listing> <Laps>500</Laps> <TrackLength>0.533</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>149</LeadingLaps> <Laps>500</Laps> <Earnings>328,466</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>214,815</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>59</DriverID> <Name>Juan Pablo Montoya</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>200,529</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>118</DriverID> <Name>Brian Vickers</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>150,315</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>155,973</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1522</RaceID> <Race_Date>09/01/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>AdvoCare 500</RaceName> <TrackName>Atlanta Motor Speedway</TrackName> <Location>Hampton, GA</Location> <TV_Listing>ESPN</TV_Listing> <Laps>325</Laps> <TrackLength>1.54</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>36</LeadingLaps> <Laps>325</Laps> <Earnings>338,058</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>78</LeadingLaps> <Laps>325</Laps> <Earnings>244,473</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>325</Laps> <Earnings>207,065</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>325</Laps> <Earnings>165,235</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>47</DriverID> <Name>Ryan Newman</Name> <LeadingLaps>3</LeadingLaps> <Laps>325</Laps> <Earnings>167,848</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1523</RaceID> <Race_Date>09/07/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>Federated Auto Parts 400</RaceName> <TrackName>Richmond International Raceway</TrackName> <Location>Richmond, VA</Location> <TV_Listing>ABC</TV_Listing> <Laps>400</Laps> <TrackLength>0.75</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>46</LeadingLaps> <Laps>400</Laps> <Earnings>286,475</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>73</LeadingLaps> <Laps>400</Laps> <Earnings>185,355</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>47</DriverID> <Name>Ryan Newman</Name> <LeadingLaps>4</LeadingLaps> <Laps>400</Laps> <Earnings>181,443</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>34</DriverID> <Name>Jamie McMurray</Name> <LeadingLaps>6</LeadingLaps> <Laps>400</Laps> <Earnings>151,805</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>310</DriverID> <Name>Paul Menard</Name> <LeadingLaps>3</LeadingLaps> <Laps>400</Laps> <Earnings>140,701</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1524</RaceID> <Race_Date>09/15/2013</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>GEICO 400</RaceName> <TrackName>Chicagoland Speedway</TrackName> <Location>Joliet, IL</Location> <TV_Listing>ESPN</TV_Listing> <Laps>267</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>89</LeadingLaps> <Laps>267</Laps> <Earnings>334,891</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>67</LeadingLaps> <Laps>267</Laps> <Earnings>261,048</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>2</LeadingLaps> <Laps>267</Laps> <Earnings>221,326</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>169,960</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>40</LeadingLaps> <Laps>267</Laps> <Earnings>176,926</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1525</RaceID> <Race_Date>09/22/2013</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>Sylvania 300</RaceName> <TrackName>New Hampshire Motor Speedway</TrackName> <Location>Loudon, NH</Location> <TV_Listing>ESPN</TV_Listing> <Laps>300</Laps> <TrackLength>1.058</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>106</LeadingLaps> <Laps>300</Laps> <Earnings>262,066</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>300</Laps> <Earnings>210,143</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>49</DriverID> <Name>Greg Biffle</Name> <LeadingLaps>0</LeadingLaps> <Laps>300</Laps> <Earnings>151,785</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>1</LeadingLaps> <Laps>300</Laps> <Earnings>160,796</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>34</DriverID> <Name>Jamie McMurray</Name> <LeadingLaps>0</LeadingLaps> <Laps>300</Laps> <Earnings>142,005</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1526</RaceID> <Race_Date>09/29/2013</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>AAA 400</RaceName> <TrackName>Dover International Speedway</TrackName> <Location>Dover, DE</Location> <TV_Listing>ESPN</TV_Listing> <Laps>400</Laps> <TrackLength>1.0</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>243</LeadingLaps> <Laps>400</Laps> <Earnings>243,836</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>80</LeadingLaps> <Laps>400</Laps> <Earnings>197,210</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>0</LeadingLaps> <Laps>400</Laps> <Earnings>166,068</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>3</LeadingLaps> <Laps>400</Laps> <Earnings>168,296</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>30</LeadingLaps> <Laps>400</Laps> <Earnings>162,068</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1527</RaceID> <Race_Date>10/06/2013</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>Hollywood Casino 400</RaceName> <TrackName>Kansas Speedway</TrackName> <Location>Kansas City, KS</Location> <TV_Listing>ESPN</TV_Listing> <Laps>267</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>138</LeadingLaps> <Laps>267</Laps> <Earnings>364,636</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>229,810</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>216,776</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>33</LeadingLaps> <Laps>267</Laps> <Earnings>176,473</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>127</DriverID> <Name>Carl Edwards</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>169,965</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1528</RaceID> <Race_Date>10/12/2013</Race_Date> <Race_Time>07:30 PM</Race_Time> <RaceName>Bank of America 500</RaceName> <TrackName>Charlotte Motor Speedway</TrackName> <Location>Concord, NC</Location> <TV_Listing>ABC</TV_Listing> <Laps>334</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>11</LeadingLaps> <Laps>334</Laps> <Earnings>314,441</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>138</LeadingLaps> <Laps>334</Laps> <Earnings>224,810</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>1</LeadingLaps> <Laps>334</Laps> <Earnings>199,426</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>130</LeadingLaps> <Laps>334</Laps> <Earnings>192,721</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>4</LeadingLaps> <Laps>334</Laps> <Earnings>163,568</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1529</RaceID> <Race_Date>10/20/2013</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>Camping World RV Sales 500</RaceName> <TrackName>Talladega Superspeedway</TrackName> <Location>Talladega, AL</Location> <TV_Listing>ESPN</TV_Listing> <Laps>188</Laps> <TrackLength>2.66</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>34</DriverID> <Name>Jamie McMurray</Name> <LeadingLaps>16</LeadingLaps> <Laps>188</Laps> <Earnings>236,345</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>38</LeadingLaps> <Laps>188</Laps> <Earnings>185,410</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>1341</DriverID> <Name>Ricky Stenhouse Jr.</Name> <LeadingLaps>6</LeadingLaps> <Laps>188</Laps> <Earnings>187,596</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>310</DriverID> <Name>Paul Menard</Name> <LeadingLaps>0</LeadingLaps> <Laps>188</Laps> <Earnings>154,726</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>304</DriverID> <Name>Kyle Busch</Name> <LeadingLaps>9</LeadingLaps> <Laps>188</Laps> <Earnings>162,068</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1530</RaceID> <Race_Date>10/27/2013</Race_Date> <Race_Time>02:00 PM</Race_Time> <RaceName>Goody's Headache Relief Shot 500</RaceName> <TrackName>Martinsville Speedway</TrackName> <Location>Ridgeway, VA</Location> <TV_Listing>ESPN</TV_Listing> <Laps>500</Laps> <TrackLength>0.526</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>22</DriverID> <Name>Jeff Gordon</Name> <LeadingLaps>78</LeadingLaps> <Laps>500</Laps> <Earnings>188,796</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>202</LeadingLaps> <Laps>500</Laps> <Earnings>177,736</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>60</LeadingLaps> <Laps>500</Laps> <Earnings>141,478</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>433</DriverID> <Name>Brad Keselowski</Name> <LeadingLaps>0</LeadingLaps> <Laps>500</Laps> <Earnings>153,436</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>123</LeadingLaps> <Laps>500</Laps> <Earnings>144,046</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1531</RaceID> <Race_Date>11/03/2013</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>AAA Texas 500</RaceName> <TrackName>Texas Motor Speedway</TrackName> <Location>Fort Worth, TX</Location> <TV_Listing>ESPN</TV_Listing> <Laps>334</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>255</LeadingLaps> <Laps>334</Laps> <Earnings>484,211</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>334</Laps> <Earnings>337,810</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>1306</DriverID> <Name>Joey Logano</Name> <LeadingLaps>1</LeadingLaps> <Laps>334</Laps> <Earnings>256,393</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>3</LeadingLaps> <Laps>334</Laps> <Earnings>238,776</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>0</LeadingLaps> <Laps>334</Laps> <Earnings>180,585</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1532</RaceID> <Race_Date>11/10/2013</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>AdvoCare 500</RaceName> <TrackName>Phoenix International Raceway</TrackName> <Location>Avondale, AZ</Location> <TV_Listing>ESPN</TV_Listing> <Laps>312</Laps> <TrackLength>1.0</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>25</DriverID> <Name>Kevin Harvick</Name> <LeadingLaps>70</LeadingLaps> <Laps>312</Laps> <Earnings>263,386</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>109</DriverID> <Name>Kasey Kahne</Name> <LeadingLaps>41</LeadingLaps> <Laps>312</Laps> <Earnings>171,715</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>27</DriverID> <Name>Jimmie Johnson</Name> <LeadingLaps>1</LeadingLaps> <Laps>312</Laps> <Earnings>182,326</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>2</LeadingLaps> <Laps>312</Laps> <Earnings>131,135</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>18</DriverID> <Name>Kurt Busch</Name> <LeadingLaps>0</LeadingLaps> <Laps>312</Laps> <Earnings>137,630</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <Listing> <RaceID>1533</RaceID> <Race_Date>11/17/2013</Race_Date> <Race_Time>03:00 PM</Race_Time> <RaceName>Ford EcoBoost 400</RaceName> <TrackName>Homestead-Miami Speedway</TrackName> <Location>Homestead, FL</Location> <TV_Listing>ESPN</TV_Listing> <Laps>267</Laps> <TrackLength>1.5</TrackLength> <RaceResults> <RaceResultsListing> <FinishPosition>1</FinishPosition> <DriverID>490</DriverID> <Name>Denny Hamlin</Name> <LeadingLaps>72</LeadingLaps> <Laps>267</Laps> <Earnings>322,350</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>2</FinishPosition> <DriverID>28</DriverID> <Name>Matt Kenseth</Name> <LeadingLaps>144</LeadingLaps> <Laps>267</Laps> <Earnings>293,251</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>3</FinishPosition> <DriverID>20</DriverID> <Name>Dale Earnhardt Jr.</Name> <LeadingLaps>28</LeadingLaps> <Laps>267</Laps> <Earnings>203,860</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>4</FinishPosition> <DriverID>266</DriverID> <Name>Martin Truex Jr.</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>179,435</Earnings> <Status>Running</Status> </RaceResultsListing> <RaceResultsListing> <FinishPosition>5</FinishPosition> <DriverID>431</DriverID> <Name>Clint Bowyer</Name> <LeadingLaps>0</LeadingLaps> <Laps>267</Laps> <Earnings>167,968</Earnings> <Status>Running</Status> </RaceResultsListing> </RaceResults> </Listing> <time_stamp> January 13, 2014, at 11:34 AM ET </time_stamp> </message>
+ test/xml/scoresxml-no-locations.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?> <!DOCTYPE message PUBLIC "-//TSN//DTD Scores 1.0/EN" "scoresxml.dtd"> <message> <XML_File_ID>20160285</XML_File_ID> <heading>BC-BLP+P26:P56* 7 7 1R14:56</heading> <game_id>50719</game_id> <schedule_id>50719</schedule_id> <category>Scores</category> <sport>CBASK-W</sport> <seasontype>Regular</seasontype> <game> <vteam id="P26">Campbell</vteam> <hteam id="P56">Gardner-Webb</hteam> <vscore>7</vscore> <hscore>7</hscore> <time_r>14:56</time_r> <status numeral="1" type="P">1 Half</status> </game> <time_stamp> January 16, 2014, at 11:17 AM ET </time_stamp> </message>
+ test/xml/scoresxml.dtd view
@@ -0,0 +1,27 @@+<!ELEMENT XML_File_ID (#PCDATA)>+<!ELEMENT heading (#PCDATA)>+<!ELEMENT game_id (#PCDATA)>+<!ELEMENT schedule_id (#PCDATA)>+<!ELEMENT tsnupdate (#PCDATA)>+<!ELEMENT category (#PCDATA)>+<!ELEMENT sport (#PCDATA)>+<!ELEMENT seasontype (#PCDATA)>+<!ELEMENT vteam (#PCDATA)>+<!ELEMENT hteam (#PCDATA)>+<!ELEMENT vscore (#PCDATA)>+<!ELEMENT hscore (#PCDATA)>+<!ELEMENT time_r (#PCDATA)>+<!ELEMENT status (#PCDATA)>+<!ELEMENT game ( ( vteam, hteam, vscore, hscore, time_r?, status, notes? ) )>+<!ELEMENT time_stamp (#PCDATA)>+<!ELEMENT message ( ( XML_File_ID, heading, game_id, schedule_id, tsnupdate?, category, sport, location*, seasontype, game, time_stamp ) )>+<!ELEMENT city (#PCDATA)>+<!ELEMENT state (#PCDATA)>+<!ELEMENT country (#PCDATA)>+<!ELEMENT location ( ( city, state, country ) )>+<!ELEMENT notes (#PCDATA)>++<!ATTLIST vteam id CDATA #REQUIRED>+<!ATTLIST hteam id CDATA #REQUIRED>+<!ATTLIST status numeral CDATA #REQUIRED>+<!ATTLIST status type CDATA #REQUIRED>
+ test/xml/scoresxml.xml view
@@ -0,0 +1,1 @@+<?xml version="1.0" standalone="no" ?> <!DOCTYPE message PUBLIC "-//TSN//DTD Scores 1.0/EN" "scoresxml.dtd"> <message> <XML_File_ID>20160114</XML_File_ID> <heading>BC-ADi+129:143* 0 0 0</heading> <game_id>18166</game_id> <schedule_id>18166</schedule_id> <category>Scores</category> <sport>NHL</sport> <location> <city>Montreal</city> <state>QUEBEC</state> <country>CANADA</country> </location> <location> <city>Ottawa</city> <state>ONTARIO</state> <country>CANADA</country> </location> <seasontype>Regular</seasontype> <game> <vteam id="129">Montreal</vteam> <hteam id="143">Ottawa</hteam> <vscore>0</vscore> <hscore>0</hscore> <status numeral="0" type="i">0 Period</status> <notes>Ottawa - Right Wing Chris Neil (1/16, lower body) is probable for Thursday's game against Montreal.</notes> </game> <time_stamp> January 16, 2014, at 10:39 AM ET </time_stamp> </message>