public Build Read()

in src/StructuredLogger/Serialization/XmlLogReader.cs [35:145]


        public Build Read(Stream stream)
        {
            Build build = new Build();
            this.stringTable = build.StringTable;

            var stack = new Stack<BaseNode>(1024);
            stack.Push(build);

            XmlNodeType previous = XmlNodeType.None;

            try
            {
                var xmlReaderSettings = new XmlReaderSettings()
                {
                    IgnoreWhitespace = true,
                };

                using (reader = XmlReader.Create(stream, xmlReaderSettings))
                {
                    reader.MoveToContent();

                    ReadAttributes();
                    PopulateAttributes(build); // read the attributes on the root Build element that we created manually

                    while (reader.Read())
                    {
                        var nodeType = reader.NodeType;
                        switch (reader.NodeType)
                        {
                            case XmlNodeType.Element:
                                var node = ReadNode();

                                var parent = (TreeNode)stack.Peek();
                                parent.AddChild(node);

                                if (!reader.IsEmptyElement)
                                {
                                    stack.Push(node);
                                }

                                break;
                            case XmlNodeType.EndElement:
                                {
                                    // if the element content is an empty string
                                    if (previous == XmlNodeType.Element)
                                    {
                                        var valueNode = stack.Peek();
                                        SetElementValue(valueNode, "");
                                    }

                                    stack.Pop();
                                    break;
                                }
                            case XmlNodeType.Text:
                                {
                                    var valueNode = stack.Peek();
                                    string value = reader.Value;
                                    SetElementValue(valueNode, stringTable.Intern(value));

                                    break;
                                }
                            case XmlNodeType.Whitespace:
                                {
                                    var valueNode = stack.Peek();
                                    var nameValueNode = valueNode as NameValueNode;
                                    if (nameValueNode != null)
                                    {
                                        nameValueNode.Value = GetCurrentValue();
                                    }
                                    else
                                    {
                                        var message = valueNode as Message;
                                        if (message != null)
                                        {
                                            message.Text = GetCurrentValue();
                                        }
                                    }

                                    break;
                                }
                            case XmlNodeType.None:
                            case XmlNodeType.Attribute:
                            case XmlNodeType.CDATA:
                            case XmlNodeType.EntityReference:
                            case XmlNodeType.Entity:
                            case XmlNodeType.ProcessingInstruction:
                            case XmlNodeType.Comment:
                            case XmlNodeType.Document:
                            case XmlNodeType.DocumentType:
                            case XmlNodeType.DocumentFragment:
                            case XmlNodeType.Notation:
                            case XmlNodeType.SignificantWhitespace:
                            case XmlNodeType.EndEntity:
                            case XmlNodeType.XmlDeclaration:
                            default:
                                break;
                        }

                        previous = nodeType;
                    }
                }
            }
            catch (Exception ex)
            {
                build = new Build() { Succeeded = false };
                build.AddChild(new Error() { Text = "Error when opening XML log file." });
                build.AddChild(new Error() { Text = ex.ToString() });
            }

            return build;
        }