private static void processPISA_BQ_single_XML(string[] Element, DateTime dt1970, logXContainer _ret, XmlSerializer logSerializer, string _PersonIdentifier, string _xml) { var _tr = new StringReader(_xml); log _log = (log)logSerializer.Deserialize(_tr); if (_log.itemGroup != null) { // update epoch information foreach (var i in _log.itemGroup) { if (!i.epochSpecified && i.userEvents.Length > 0) { i.epoch = i.userEvents[0].epoch; } } List <logItemGroup> _sortedItemGroupList = _log.itemGroup.OrderBy(o => o.epoch).ToList(); DateTime _MinAbsoluteTime = DateTime.MaxValue; DateTime _PreviousEvent = DateTime.MaxValue; if (_log.User != _PersonIdentifier) { throw new Exception("Person identifier miss-match."); } int _EventID = _ret.GetMaxID(_PersonIdentifier); int _EventVisitCounter = 0; Dictionary <string, int> _elementVisitCounterDict = new Dictionary <string, int>(); string _currentElement = ""; foreach (var p in _sortedItemGroupList) { string _Element = p.code; if (_currentElement != _Element) { _EventVisitCounter = 0; _currentElement = _Element; if (!_elementVisitCounterDict.ContainsKey(_Element)) { _elementVisitCounterDict.Add(_Element, 0); } else { _elementVisitCounterDict[_Element] += 1; } } DateTime _ElementStart = dt1970.AddMilliseconds(p.epoch); if (_PreviousEvent == DateTime.MaxValue) { _PreviousEvent = _ElementStart; } foreach (var _event in p.userEvents) { string _LogEventName = _event.type; DateTime _AbsoluteTime = dt1970.AddMilliseconds(_event.epoch); if (_AbsoluteTime < _MinAbsoluteTime) { _MinAbsoluteTime = _AbsoluteTime; } Dictionary <string, string> _EventValues = new Dictionary <string, string>(); for (int i = 0; i < _event.ItemsElementName.Length; i++) { if (_event.ItemsElementName[i].ToString() == "context") { _EventValues.Add("Context", _event.Items[i]); } else if (_event.ItemsElementName[i].ToString() == "value") { _EventValues.Add("Value", _event.Items[i]); } else if (_event.ItemsElementName[i].ToString() == "id") { _EventValues.Add("Id", _event.Items[i]); } else { throw new Exception("Element name not expected."); } } _EventValues.Add("RelativeTimeFrame", (_AbsoluteTime - _ElementStart).TotalMilliseconds.ToString()); _EventValues.Add("RelativeTimePrevious", (_AbsoluteTime - _PreviousEvent).TotalMilliseconds.ToString()); if (Element.Length == 0 || Element.Contains <string>(_Element)) { var doc = new XDocument(new XElement(_LogEventName)); var root = doc.Root; foreach (string val in _EventValues.Keys) { root.Add(new XAttribute(val, _EventValues[val])); } logxGenericLogElement _parament = new logxGenericLogElement() { PersonIdentifier = _PersonIdentifier, Item = _Element, EventID = _EventID, EventName = _LogEventName, TimeStamp = _AbsoluteTime, EventDataXML = doc.ToString() }; _ret.AddEvent(_parament); } _EventID += 1; _EventVisitCounter += 1; _PreviousEvent = _AbsoluteTime; } } // check for suspicious times /* TODO * _currentElement = ""; * List<string> framesWithSuspiciousData = new List<string>(); * foreach (var v in _inMemoryTempDataEvents) * { * if (_currentElement != v.EventName) * _currentElement = v.EventName; * * if (v.TimeDifferencePrevious.TotalMinutes > 30) * v.AddEventValue("Flag", "TimeToLong"); * * if (v.TimeDifferencePrevious.TotalMilliseconds < 0) * v.AddEventValue("Flag", "TimeNegative"); * } */ } _tr.Close(); }