private static TreeEntry ParseYaml(StringCollectionReader scr) { var rootNode = new TreeEntry(); rootNode.IndentCount = 0; rootNode.Children = new List <TreeEntry>(); TreeEntry parentNode = rootNode; TreeEntry previousNode = rootNode; int previousIndentCount = rootNode.IndentCount; string previousLine = string.Empty; bool isStackTrace = false; while (scr.CanRead) { var line = scr.ReadLine(); Regex rg_hash = new Regex(PATTERN_CANDIDATE); Regex rg_value = new Regex(PATTERN_VALUE); Match mc = null; if (rg_hash.IsMatch(line)) { mc = rg_hash.Match(line); } else if (rg_value.IsMatch(line)) { mc = rg_value.Match(line); } bool isArray = IsArray(mc); int indent = GetIndentCount(line); if (isStackTrace && parentNode.IndentCount < indent) { var currentNode = new TreeEntry(parentNode, null, indent, isArray); currentNode.HeaderVisibility = System.Windows.Visibility.Hidden; currentNode.Value = line.Trim(); parentNode.Children.Add(currentNode); previousNode = currentNode; } else if (isStackTrace && parentNode.IndentCount == indent) { isStackTrace = false; parentNode = parentNode.Parent; var currentNode = new TreeEntry(parentNode, mc.Groups["key"].Value, indent, isArray); currentNode.Value = mc.Groups["value"].Value.Trim(); parentNode.Children.Add(currentNode); previousNode = currentNode; } else if (previousIndentCount < indent) { parentNode = previousNode; var currentNode = new TreeEntry(parentNode, mc != null ? mc.Groups["key"].Value : null, indent, isArray); currentNode.HeaderVisibility = System.Windows.Visibility.Hidden; currentNode.Value = mc != null ? mc.Groups["value"].Value.Trim() : line.Trim(); parentNode.Children.Add(currentNode); previousNode = currentNode; if (line.Contains("StackTrace")) { isStackTrace = true; parentNode = currentNode; } } else if (previousIndentCount == indent) //loop { var currentNode = new TreeEntry(parentNode, mc != null ? mc.Groups["key"].Value : null, indent, isArray); currentNode.Value = mc != null ? mc.Groups["value"].Value.Trim() : line.Trim(); currentNode.HeaderVisibility = mc != null ? System.Windows.Visibility.Visible : System.Windows.Visibility.Hidden; parentNode.Children.Add(currentNode); previousNode = currentNode; if (line.Contains("StackTrace")) { isStackTrace = true; parentNode = currentNode; } } else if (parentNode.IndentCount == indent) //ascending { parentNode = parentNode.Parent; var currentNode = new TreeEntry(parentNode, mc.Groups["key"].Value, indent, isArray); currentNode.Value = mc.Groups["value"].Value.Trim(); parentNode.Children.Add(currentNode); previousNode = currentNode; if (line.Contains("StackTrace")) { isStackTrace = true; parentNode = currentNode; } } previousIndentCount = indent; } return(rootNode); }