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