Example #1
0
        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());
        }
Example #2
0
        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());
        }