private async Task BuildTreeAsync(XmlReader reader, TreeViewItem treeViewItem) { // TreeViewItem to add to existing tree var newNode = new TreeViewItem { IsExpanded = true }; while (await reader.ReadAsync()) { // build tree based on node type switch (reader.NodeType) { // if Text node, add its value to tree case XmlNodeType.Text: newNode.Header = reader.Value; treeViewItem.Items.Add(newNode); break; case XmlNodeType.EndElement: // if EndElement, move up tree treeViewItem = (TreeViewItem)treeViewItem.Parent; break; // if new element, add name and traverse tree case XmlNodeType.Element: { var elementType = reader.NodeType.ToString(); var elementName = reader.Name; var attributeStr = string.Empty; //To keep atrribute Name and its Value in Dictionary if (reader.HasAttributes) { var count = reader.AttributeCount; var fidId = 0; for (var i = 0; i < count; i++) { reader.MoveToAttribute(i); var attributeName = reader.Name.Trim(); var attributeVal = reader.Value.Trim(); var hexValue = ""; if (elementName == "fieldEntry") { switch (attributeName) { case "fieldId": { fidId = int.Parse(attributeVal); if (_fieldDictionary.GetDictEntryById(fidId, out var rdmEntry)) { attributeVal = $"{rdmEntry.Acronym}({int.Parse(attributeVal)})"; } else { attributeVal = $"Unknown({int.Parse(attributeVal)})"; } break; } case "data": { hexValue = attributeVal; if (XMLFragmentsData.FieldValueToString( fidId, attributeVal, _fieldDictionary, _enumTypeDef, out var output, out var errorMsg)) { attributeVal = $"{output}"; } break; } } } attributeStr += $" {attributeName}=\"{attributeVal}\""; if (attributeName == "data") { attributeStr += $" Hex=\"{hexValue}\""; } } } newNode.Header = $"{elementName} {attributeStr}"; reader.MoveToElement(); treeViewItem.Items.Add(newNode); if (!reader.IsEmptyElement) { treeViewItem = newNode; } } break; default: newNode.Header = reader.NodeType.ToString(); treeViewItem.Items.Add(newNode); break; } newNode = new TreeViewItem { IsExpanded = true }; } }
private async Task <MrnMsgList> DecodeMrn(XmlFragmentList xmlFragments) { var messageList = new MrnMsgList(); await Task.Run(async() => { var decodeMrnResult = await MrnFragmentDecoder.DecodeMrnDataAsync(xmlFragments) .ConfigureAwait(false); if (!decodeMrnResult.Item1) { MessageBox.Show(decodeMrnResult.Item3); return(null); } messageList = decodeMrnResult.Item2; foreach (var data in xmlFragments.Fragments) { var xmlFragment = new XMLFragmentsData { Index = data.FragmentNumber, RdmMessageType = data.RdmMessageType, TimeStamp = data.TimeStamp, DomainType = messageList.Get(data.FragmentNumber).DomainType, MsgDirection = data.MsgTypeRawXmlData != string.Empty ? data.IsIncomingMsg ? "Incoming" : "Outgoing" : string.Empty, XmlRawData = data.RawXmlData, GUID = string.Empty, RequestKeyName = messageList.Get(data.FragmentNumber).RequestKeyName ?? string.Empty, StreamId = int.Parse(messageList.Get(data.FragmentNumber).GetFragmentAttribs()["streamId"]) }; if (messageList.Get(data.FragmentNumber).ContainsFieldList) { if (messageList.Get(data.FragmentNumber).GetFieldList().ContainsKey(4271)) { if (!string.IsNullOrEmpty(messageList.Get(data.FragmentNumber).GetFieldList()[4271].Trim())) { var pBuffer = TraceStringToString( messageList.Get(data.FragmentNumber).GetFieldList()[4271].Trim()); xmlFragment.GUID = pBuffer; } } if (messageList.Get(data.FragmentNumber).GetFieldList().ContainsKey(32479)) { if (!string.IsNullOrEmpty(messageList.Get(data.FragmentNumber).GetFieldList()[32479].Trim()) ) { var mrnFragmentNumber = HexStringToInt(messageList.Get(data.FragmentNumber).GetFieldList()[32479].Trim()) ?? 0; xmlFragment.MrnFragmentNumber = mrnFragmentNumber; } } } Dispatcher.Invoke(() => { _fragmentCollection.Add(xmlFragment); }); } return(messageList); }); return(messageList); }