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);
        }