protected XmlNode LoadXmlString(string xml, string rootName = "root") { XmlReader xr = XmlReader.Create(new StringReader(xml)); root = null; parents.Clear(); while (xr.Read()) { if (xr.NodeType == XmlNodeType.Element && (xr.IsStartElement() || xr.IsEmptyElement)) { XmlNode node = parents.Count < 1 ? new XmlNode { Name = rootName } : root.New<XmlNode>(); node.Text = xr.Value; node.Name = xr.Name; node.NodeType = xr.NodeType; node.ValueType = xr.ValueType.FullName; if (xr.HasAttributes) { for (int i = 0; i < xr.AttributeCount; i++) { XmlAttribute att = new XmlAttribute(); xr.MoveToAttribute(i); att.Name = xr.Name; xr.GetAttribute(i); att.Text = xr.Value; node.Attributes.Add(att); } xr.MoveToElement(); } if (parents.Count < 1) { root = node; } else { parents.Peek().Add(node); } if (!xr.IsEmptyElement) { parents.Push(node); } if (OnReadStartElement != null) { OnReadStartElement(node); } } else if (xr.NodeType == XmlNodeType.Text || xr.NodeType == XmlNodeType.CDATA) { parents.Peek().Text = xr.Value; if (OnReadTextElement != null) { OnReadTextElement(parents.Peek()); } } else if (xr.NodeType == XmlNodeType.EndElement) { if (OnReadEndElement != null) { OnReadEndElement(parents.Peek()); } parents.Pop(); } } return root; }