示例#1
0
        private XmlToken TokenizeSimple(string text, XmlTokenKind kind, XmlTokenizerMode nextMode)
        {
            XmlToken token = new XmlToken(kind, text.Length);

            position += text.Length;
            mode      = nextMode;
            return(token);
        }
示例#2
0
        private XmlToken TokenizeEntity()
        {
            Debug.Assert(mode == XmlTokenizerMode.OutsideElement);
            Debug.Assert(input[position] == '&');
            XmlToken token = new XmlToken(XmlTokenKind.Entity, input.IndexOf(';', position) - position);

            position += token.Length;
            return(token);
        }
示例#3
0
        private XmlToken TokenizeAttributeValue()
        {
            Debug.Assert(mode == XmlTokenizerMode.AfterAttributeEquals);
            int      closePosition = input.IndexOf(input[position], position + 1);
            XmlToken token         = new XmlToken(XmlTokenKind.AttributeValue, closePosition + 1 - position);

            position = closePosition + 1;
            mode     = XmlTokenizerMode.InsideElement;
            return(token);
        }
示例#4
0
        private XmlToken NextToken()
        {
            if (position >= input.Length)
            {
                return(new XmlToken(XmlTokenKind.EOF, 0));
            }
            XmlToken token;

            switch (mode)
            {
            case XmlTokenizerMode.AfterAttributeEquals:
                token = TokenizeAttributeValue();
                break;

            case XmlTokenizerMode.AfterAttributeName:
                token = TokenizeSimple("=", XmlTokenKind.Equals, XmlTokenizerMode.AfterAttributeEquals);
                break;

            case XmlTokenizerMode.AfterOpen:
                token = TokenizeName(XmlTokenKind.ElementName, XmlTokenizerMode.InsideElement);
                break;

            case XmlTokenizerMode.InsideCData:
                token = TokenizeInsideCData();
                break;

            case XmlTokenizerMode.InsideComment:
                token = TokenizeInsideComment();
                break;

            case XmlTokenizerMode.InsideElement:
                token = TokenizeInsideElement();
                break;

            case XmlTokenizerMode.InsideProcessingInstruction:
                token = TokenizeInsideProcessingInstruction();
                break;

            case XmlTokenizerMode.OutsideElement:
                token = TokenizeOutsideElement();
                break;

            default:
                token = new XmlToken(XmlTokenKind.EOF, 0);
                Debug.Fail("missing case");
                break;
            }
            return(token);
        }
示例#5
0
        private XmlToken TokenizeElementWhitespace()
        {
            int i;

            for (i = position; i < input.Length; i++)
            {
                if (!char.IsWhiteSpace(input[i]))
                {
                    break;
                }
            }
            XmlToken token = new XmlToken(XmlTokenKind.ElementWhitespace, i - position);

            position = i;
            return(token);
        }
示例#6
0
        private XmlToken TokenizeInsideComment()
        {
            Debug.Assert(mode == XmlTokenizerMode.InsideComment);
            int tokenend = input.IndexOf("-->", position);

            if (position == tokenend)
            {
                position += "-->".Length;
                mode      = XmlTokenizerMode.OutsideElement;
                return(new XmlToken(XmlTokenKind.CommentEnd, "-->".Length));
            }
            else
            {
                XmlToken token = new XmlToken(XmlTokenKind.CommentText, tokenend - position);
                position = tokenend;
                return(token);
            }
        }
示例#7
0
        private XmlToken TokenizeInsideCData()
        {
            Debug.Assert(mode == XmlTokenizerMode.InsideCData);
            int tokenend = input.IndexOf("]]>", position);

            if (position == tokenend)
            {
                position += "]]>".Length;
                mode      = XmlTokenizerMode.OutsideElement;
                return(new XmlToken(XmlTokenKind.CDataEnd, "]]>".Length));
            }
            else
            {
                XmlToken token = new XmlToken(XmlTokenKind.TextContent, tokenend - position);
                position = tokenend;
                return(token);
            }
        }
示例#8
0
        private XmlToken TokenizeInsideProcessingInstruction()
        {
            Debug.Assert(mode == XmlTokenizerMode.InsideProcessingInstruction);
            int tokenend = input.IndexOf("?>", position);

            if (position == tokenend)
            {
                position += "?>".Length;
                mode      = XmlTokenizerMode.OutsideElement;
                return(new XmlToken(XmlTokenKind.CloseProcessingInstruction, "?>".Length));
            }
            else
            {
                XmlToken token = new XmlToken(XmlTokenKind.TextContent, tokenend - position);
                position = tokenend;
                return(token);
            }
        }
示例#9
0
        private XmlToken TokenizeName(XmlTokenKind kind, XmlTokenizerMode nextMode)
        {
            Debug.Assert(mode == XmlTokenizerMode.AfterOpen || mode == XmlTokenizerMode.InsideElement);
            int i;

            for (i = position; i < input.Length; i++)
            {
                if (!IsNameCharacter(input[i]))
                {
                    break;
                }
            }
            XmlToken token = new XmlToken(kind, i - position);

            mode     = nextMode;
            position = i;
            return(token);
        }
示例#10
0
        private XmlToken TokenizeText()
        {
            Debug.Assert(input[position] != '<');
            Debug.Assert(input[position] != '&');
            Debug.Assert(mode == XmlTokenizerMode.OutsideElement);
            int i;

            for (i = position; i < input.Length; i++)
            {
                if (input[i] == '<' || input[i] == '&')
                {
                    break;
                }
            }
            XmlToken token = new XmlToken(XmlTokenKind.TextContent, i - position);

            position = i;
            return(token);
        }