public virtual IEnumerable <IDOMElement> Serialize(StringBuilder denormalizedDom) { var serializedList = new List <IDOMElement>(); try { var splitCharacters = new[] { '>', '<' }; var normalizedDom = denormalizedDom.Split(el => splitCharacters.Any(elem => elem == el), el => el == '>'); IDOMElement parentNode = null; var complexElementProcessing = false; foreach (var el in normalizedDom) { if (el.Length > 0) { var tagName = string.Empty; var tagNameIndexEnd = el.FirstIndexOfAny(false, " ", "\t", "\n"); if (el.Length >= 2 && el[0] == '<' && (el[1] == '/' || (complexElementProcessing && (el[1] == '!' || (el[el.Length - 1] == '>' && el[el.Length - 2] == '-'))))) { tagName = el.GetRange(2, tagNameIndexEnd > 0 ? tagNameIndexEnd - 1 : el.Length - 3).ToString().ToLower(); if (complexElementProcessing && ((el[1] == '!' && (tagName.Length > 2 && tagName[tagName.Length - 1] == '-' && tagName[tagName.Length - 2] == '-')) || tagName.Length >= 1 && tagName[tagName.Length - 1] == '-')) { tagName = "--"; } var curretnNode = parentNode; if (complexElementProcessing) { if (curretnNode.TagName == tagName) { complexElementProcessing = false; curretnNode.IsDomElementComplete = true; while (curretnNode != null && curretnNode.IsDomElementComplete) { curretnNode = curretnNode.Parent; } parentNode = curretnNode == null ? null : curretnNode; } else { parentNode.AddComplexElementContent(el.ToString()); } } else { while (curretnNode != null && (curretnNode.TagName != tagName || curretnNode.IsDomElementComplete)) { curretnNode = curretnNode.Parent; } if (curretnNode != null && curretnNode.TagName == tagName && !curretnNode.IsDomElementComplete) { curretnNode.IsDomElementComplete = true; while (curretnNode != null && curretnNode.IsDomElementComplete) { curretnNode = curretnNode.Parent; } parentNode = curretnNode == null ? null : curretnNode; } } } else { if (complexElementProcessing) { parentNode.AddComplexElementContent(el.ToString()); } else { var newElement = new DOMElement(parentNode, el); if (parentNode == null) { serializedList.Add(newElement); } else { parentNode.AddChild(newElement); } if (!newElement.IsDomElementComplete && !newElement.BadTag) { parentNode = newElement; complexElementProcessing = parentNode.ElementType == DOMEleementTypeEnum.Script || parentNode.ElementType == DOMEleementTypeEnum.Comment || parentNode.ElementType == DOMEleementTypeEnum.NoScript; } } } } } } catch (Exception ex) { Logger.LogException(ex, LogTypeEnum.CORE, string.Format("Serialize for {0} parser failed", GetType().Name)); } return(serializedList); }