Exemplo n.º 1
0
    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));
    }
Exemplo n.º 2
0
    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);
        }
    }
Exemplo n.º 3
0
    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));
        }
    }
Exemplo n.º 4
0
 public XmlParent(uint level, string name, XmlParent parent)
 {
     this.level  = level;
     this.name   = name;
     this.parent = parent;
 }