public static Runner[] ParseXmlData(XmlDocument xmlDoc, LogMessageDelegate logit, bool deleteFile, LiveResults.Client.Parsers.IofXmlParser.GetIdDelegate getIdFunc, bool readRadioControls, out RadioControl[] radioControls) { var nsMgr = new XmlNamespaceManager(xmlDoc.NameTable); nsMgr.AddNamespace("iof", "http://www.orienteering.org/datastandard/3.0"); var runners = new List <Runner>(); var t_radioControls = readRadioControls ? new List <RadioControl>() : null; #region parseStartlist foreach (XmlNode classStartNode in xmlDoc.GetElementsByTagName("ClassStart")) { XmlNode classNode = classStartNode.SelectSingleNode("iof:Class", nsMgr); if (classNode == null) { continue; } XmlNode classNameNode = classNode.SelectSingleNode("iof:Name", nsMgr); if (classNameNode == null) { continue; } string className = classNameNode.InnerText; /*Relay*/ var teamStartNodes = classStartNode.SelectNodes("iof:TeamStart", nsMgr); if (teamStartNodes != null) { foreach (XmlNode teamStartNode in teamStartNodes) { var teamNameNode = teamStartNode.SelectSingleNode("iof:Name", nsMgr); if (teamNameNode == null) { continue; } string teamName = teamNameNode.InnerText; var teamMemberStartNodes = teamStartNode.SelectNodes("iof:TeamMemberStart", nsMgr); if (teamMemberStartNodes != null) { foreach (XmlNode teamMemberStartNode in teamMemberStartNodes) { string name = GetNameForTeamMember(nsMgr, teamMemberStartNode); var legNode = teamMemberStartNode.SelectSingleNode("iof:Start/iof:Leg", nsMgr); if (legNode != null) { string leg = legNode.InnerText; var startTimeNode = teamMemberStartNode.SelectSingleNode("iof:Start/iof:StartTime", nsMgr); if (startTimeNode == null) { continue; } string starttime = startTimeNode.InnerText; var runner = new Runner(-1, name, teamName, className + "-" + leg); if (!string.IsNullOrEmpty(starttime)) { int istarttime = ParseTime(starttime); runner.SetStartTime(istarttime); } runners.Add(runner); } } } } } /*Individual*/ var personNodes = classStartNode.SelectNodes("iof:PersonStart", nsMgr); if (personNodes != null) { foreach (XmlNode personNode in personNodes) { string familyname; string givenname; string club; if (!ParseNameClubAndId(personNode, nsMgr, out familyname, out givenname, out club)) { continue; } var startTimeNode = personNode.SelectSingleNode("iof:Start/iof:StartTime", nsMgr); if (startTimeNode == null) { continue; } string starttime = startTimeNode.InnerText; var runner = new Runner(-1, givenname + " " + familyname, club, className); if (!string.IsNullOrEmpty(starttime)) { int istarttime = ParseTime(starttime); runner.SetStartTime(istarttime); } runners.Add(runner); } } } #endregion foreach (XmlNode classResultNode in xmlDoc.GetElementsByTagName("ClassResult")) { XmlNode classNode = classResultNode.SelectSingleNode("iof:Class", nsMgr); if (classNode == null) { continue; } XmlNode classNameNode = classNode.SelectSingleNode("iof:Name", nsMgr); if (classNameNode == null) { continue; } string className = classNameNode.InnerText; /*Read splitcontrols-extension*/ if (readRadioControls) { CheckReadRadioDefinitionFromComment(t_radioControls, classNode, className); var legNodes = classResultNode.SelectNodes("iof:Class/iof:Leg", nsMgr); if (legNodes != null) { for (int leg = 0; leg < legNodes.Count; leg++) { var legNode = legNodes[leg]; CheckReadRadioDefinitionFromComment(t_radioControls, legNode, className + "-" + (leg + 1)); } } } var teamResultNodes = classResultNode.SelectNodes("iof:TeamResult", nsMgr); if (teamResultNodes != null) { foreach (XmlNode teamResultNode in teamResultNodes) { var teamNameNode = teamResultNode.SelectSingleNode("iof:Name", nsMgr); if (teamNameNode == null) { continue; } string teamName = teamNameNode.InnerText; var teamMemberResultNodes = teamResultNode.SelectNodes("iof:TeamMemberResult", nsMgr); if (teamMemberResultNodes != null) { foreach (XmlNode teamMemberResult in teamMemberResultNodes) { string name = GetNameForTeamMember(nsMgr, teamMemberResult); var legNode = teamMemberResult.SelectSingleNode("iof:Result/iof:Leg", nsMgr); if (legNode != null) { string leg = legNode.InnerText; var runner = new Runner(-1, name, teamName, className + "-" + leg); var competitorStatusNode = teamMemberResult.SelectSingleNode("iof:Result/iof:OverallResult/iof:Status", nsMgr); var resultTimeNode = teamMemberResult.SelectSingleNode("iof:Result/iof:OverallResult/iof:Time", nsMgr); var startTimeNode = teamMemberResult.SelectSingleNode("iof:Result/iof:StartTime", nsMgr); string status = "notActivated"; if (competitorStatusNode != null) { status = competitorStatusNode.InnerText; } if (status.ToLower() == "notcompeting" || status.ToLower() == "cancelled") { //Does not compete, exclude continue; } string time; ParseResult(runner, resultTimeNode, startTimeNode, status, out time); XmlNodeList splittimes = teamMemberResult.SelectNodes("iof:Result/iof:SplitTime", nsMgr); ParseSplitTimes(nsMgr, runner, time, splittimes); runners.Add(runner); } } } } } var personNodes = classResultNode.SelectNodes("iof:PersonResult", nsMgr); if (personNodes != null) { foreach (XmlNode personNode in personNodes) { string familyname; string givenname; string club; if (!ParseNameClubAndId(personNode, nsMgr, out familyname, out givenname, out club)) { continue; } var runner = new Runner(-1, givenname + " " + familyname, club, className); var competitorStatusNode = personNode.SelectSingleNode("iof:Result/iof:Status", nsMgr); var resultTimeNode = personNode.SelectSingleNode("iof:Result/iof:Time", nsMgr); var startTimeNode = personNode.SelectSingleNode("iof:Result/iof:StartTime", nsMgr); if (competitorStatusNode == null) { continue; } string status = competitorStatusNode.InnerText; if (status.ToLower() == "notcompeting" || status.ToLower() == "cancelled") { //Does not compete, exclude continue; } string time; ParseResult(runner, resultTimeNode, startTimeNode, status, out time); XmlNodeList splittimes = personNode.SelectNodes("iof:Result/iof:SplitTime", nsMgr); ParseSplitTimes(nsMgr, runner, time, splittimes); runners.Add(runner); } } } radioControls = (t_radioControls != null && t_radioControls.Count > 0) ? t_radioControls.ToArray() : null; return(runners.ToArray()); }
public static Runner[] ParseXmlData(XmlDocument xmlDoc, LogMessageDelegate logit, bool deleteFile, LiveResults.Client.Parsers.IofXmlParser.GetIdDelegate getIdFunc) { var runners = new List <Runner>(); #region parseStartlist foreach (XmlNode classNode in xmlDoc.GetElementsByTagName("ClassStart")) { XmlNode classNameNode = classNode.SelectSingleNode("ClassShortName"); if (classNameNode == null) { continue; } string className = classNameNode.InnerText; var personNodes = classNode.SelectNodes("PersonStart"); if (personNodes != null) { foreach (XmlNode personNode in personNodes) { string familyname; string givenname; string club; if (!ParseNameClubAndId(personNode, out familyname, out givenname, out club)) { continue; } var startTimeNode = personNode.SelectSingleNode("Start/StartTime/Clock"); // var ccCardNode = personNode.SelectSingleNode("Start/CCard/CCardId"); if (startTimeNode == null) { continue; } string starttime = startTimeNode.InnerText; //string si = ccCardNode.InnerText; //string storeAlias; //if (string.IsNullOrEmpty(sourceId) && string.IsNullOrEmpty(si)) //{ // string name = givenname + " " + familyname + ", " + club; // if (!m_suppressedIDCalculationErrors.ContainsKey(name)) // { // logit("Cannot calculculate ID for runner: " + name + ", skipping [supressing further output for this name]"); // m_suppressedIDCalculationErrors.Add(name, name); // } // continue; //} //int dbId = getIdFunc(sourceId, si, out storeAlias); var runner = new Runner(-1, givenname + " " + familyname, club, className); if (!string.IsNullOrEmpty(starttime)) { int istarttime = ParseTime(starttime); runner.SetStartTime(istarttime); } runners.Add(runner); } } } #endregion foreach (XmlNode classNode in xmlDoc.GetElementsByTagName("ClassResult")) { XmlNode classNameNode = classNode.SelectSingleNode("ClassShortName"); if (classNameNode == null) { continue; } string className = classNameNode.InnerText; var personNodes = classNode.SelectNodes("PersonResult"); if (personNodes != null) { foreach (XmlNode personNode in personNodes) { string familyname; string givenname; string club; // string sourceId; if (!ParseNameClubAndId(personNode, out familyname, out givenname, out club)) { continue; } var competitorStatusNode = personNode.SelectSingleNode("Result/CompetitorStatus"); var resultTimeNode = personNode.SelectSingleNode("Result/Time"); var startTimeNode = personNode.SelectSingleNode("Result/StartTime/Clock"); //var ccCardNode = personNode.SelectSingleNode("Result/CCard/CCardId"); if (competitorStatusNode == null || competitorStatusNode.Attributes == null || competitorStatusNode.Attributes["value"] == null || resultTimeNode == null) { continue; } string status = competitorStatusNode.Attributes["value"].Value; string time = resultTimeNode.InnerText; string starttime = ""; if (startTimeNode != null) { starttime = startTimeNode.InnerText; } //string si = ccCardNode.InnerText; //string storeAlias; //if (string.IsNullOrEmpty(sourceId) && string.IsNullOrEmpty(si)) //{ // string name = givenname + " " + familyname + ", " + club; // if (!m_suppressedIDCalculationErrors.ContainsKey(name)) // { // logit("Cannot calculculate ID for runner: " + name + ", skipping [supressing further output for this name]"); // m_suppressedIDCalculationErrors.Add(name, name); // } // continue; //} //int dbId = getIdFunc(sourceId, si, out storeAlias); var runner = new Runner(-1, givenname + " " + familyname, club, className); if (!string.IsNullOrEmpty(starttime)) { int istarttime = ParseTime(starttime); runner.SetStartTime(istarttime); } int itime = ParseTime(time); int istatus = 10; if (status.ToLower() == "notcompeting") { //Does not compete, exclude continue; } //runners without starttimenode have not started yet if (startTimeNode != null) { switch (status.ToLower()) { case "mispunch": istatus = 3; break; case "disqualified": istatus = 4; break; case "didnotfinish": istatus = 3; itime = -3; break; case "didnotstart": istatus = 1; itime = -3; break; case "overtime": istatus = 5; break; case "ok": istatus = 0; break; } } runner.SetResult(itime, istatus); var lsplitCodes = new List <int>(); var lsplitTimes = new List <int>(); XmlNodeList splittimes = personNode.SelectNodes("Result/SplitTime"); if (splittimes != null) { foreach (XmlNode splitNode in splittimes) { XmlNode splitcode = splitNode.SelectSingleNode("ControlCode"); XmlNode splittime = splitNode.SelectSingleNode("Time"); if (splittime == null || splitcode == null) { continue; } int iSplitcode; string sSplittime = splittime.InnerText; bool parseOK = int.TryParse(splitcode.InnerText, out iSplitcode); bool isFinishPunch = splitcode.InnerText.StartsWith("F", StringComparison.InvariantCultureIgnoreCase) || iSplitcode == 999; if ((parseOK || isFinishPunch) && sSplittime.Length > 0) { if (isFinishPunch) { if ((istatus == 0 && itime == -1) || (istatus == 10 && itime == -9)) { //Målstämpling itime = ParseTime(sSplittime); runner.SetResult(itime, 0); } } else { iSplitcode += 1000; while (lsplitCodes.Contains(iSplitcode)) { iSplitcode += 1000; } int iSplittime = ParseTime(sSplittime); lsplitCodes.Add(iSplitcode); lsplitTimes.Add(iSplittime); runner.SetSplitTime(iSplitcode, iSplittime); } } } } runners.Add(runner); } } } return(runners.ToArray()); }