public static ICollection <IXmlChild> Parse(ref string text) { int index = 0; uint endLevel; XmlParent self = new XmlParent(0, "", null); return(Parse(ref text, ref index, out endLevel, self)); }
private static ICollection <IXmlChild> Parse(ref string text, ref int index, out uint endLevel, XmlParent parent) { LinkedList <IXmlChild> xmlChilds = new LinkedList <IXmlChild>(); int contentStart = index; int contentEnd = contentStart; endLevel = 0; while (index < text.Length) { IXmlElement xmlElement = GetElement(ref text, ref index, out endLevel, parent); if (endLevel != 0) { if (xmlElement != null) { xmlChilds.AddLast(xmlElement); } break; } else if (xmlElement == null) { SkipContentEnd(ref text, ref index, ref contentEnd); } else { if (contentEnd > contentStart) { xmlChilds.AddLast(MyXml.Content(text.Substring(contentStart, contentEnd - contentStart))); } xmlChilds.AddLast(xmlElement); contentStart = index; contentEnd = contentStart; } } if (parent.level == 0) { if (contentEnd > contentStart && IsContainNonWhiteChar(ref text, contentStart, contentEnd)) { xmlChilds.AddLast(MyXml.Content(text.Substring(contentStart, contentEnd - contentStart))); } return(xmlChilds); } else if (endLevel != 0) { if (contentEnd > contentStart) { xmlChilds.AddLast(MyXml.Content(text.Substring(contentStart, contentEnd - contentStart))); } return(xmlChilds); } else { return(null); } }
private static IXmlElement GetElement(ref string text, ref int index, out uint endLevel, XmlParent parent) { endLevel = 0; if (!SkipLessThanChar(ref text, ref index)) { return(null); } if (text[index] == '/') { index++; if (parent.parent == null) { return(null); } XmlParent curr = parent; int skipStringIndex; do { skipStringIndex = index; if (SkipString(ref text, ref curr.name, ref skipStringIndex) && SkipGreaterThanChar(ref text, ref skipStringIndex)) { endLevel = curr.level; break; } curr = curr.parent; }while (curr.parent != null); index = skipStringIndex; return(null); } string elementName = GetElementName(ref text, ref index); if (elementName == null) { return(null); } ICollection <IXmlAttribute> attributes = GetAttributes(ref text, ref index); if (attributes == null) { return(null); } uint nextEndLevel; XmlParent self = new XmlParent(parent.level + 1, elementName, parent); ICollection <IXmlChild> xmlChilds = Parse(ref text, ref index, out nextEndLevel, self); if (nextEndLevel <= parent.level) { endLevel = nextEndLevel; } if (xmlChilds == null) { return(null); } else { return(MyXml.Element(elementName, attributes, xmlChilds)); } }
public XmlParent(uint level, string name, XmlParent parent) { this.level = level; this.name = name; this.parent = parent; }