Пример #1
0
        public static bool NextTag()
        {
            int pos;

            tagType       = XMLTagType.Start;
            BUFFER.Length = 0;
            _lastTagEnd   = _parsePos;
            _attrParsed   = false;
            lastTagName   = tagName;

            while ((pos = _source.IndexOf('<', _parsePos)) != -1)
            {
                _parsePos = pos;
                pos++;

                if (pos == _sourceLen)
                {
                    break;
                }

                char c = _source[pos];
                if (c == '!')
                {
                    if (_sourceLen > pos + 7 && _source.Substring(pos - 1, 9) == CDATA_START)
                    {
                        pos     = _source.IndexOf(CDATA_END, pos, StringComparison.Ordinal);
                        tagType = XMLTagType.CDATA;
                        tagName = string.Empty;
                        _tagPos = _parsePos;
                        if (pos == -1)
                        {
                            _tagLength = _sourceLen - _parsePos;
                        }
                        else
                        {
                            _tagLength = pos + 3 - _parsePos;
                        }
                        _parsePos += _tagLength;
                        return(true);
                    }
                    if (_sourceLen > pos + 2 && _source.Substring(pos - 1, 4) == COMMENT_START)
                    {
                        pos     = _source.IndexOf(COMMENT_END, pos, StringComparison.Ordinal);
                        tagType = XMLTagType.Comment;
                        tagName = string.Empty;
                        _tagPos = _parsePos;
                        if (pos == -1)
                        {
                            _tagLength = _sourceLen - _parsePos;
                        }
                        else
                        {
                            _tagLength = pos + 3 - _parsePos;
                        }
                        _parsePos += _tagLength;
                        return(true);
                    }
                    pos++;
                    tagType = XMLTagType.Instruction;
                }
                else if (c == '/')
                {
                    pos++;
                    tagType = XMLTagType.End;
                }
                else if (c == '?')
                {
                    pos++;
                    tagType = XMLTagType.Instruction;
                }

                for ( ; pos < _sourceLen; pos++)
                {
                    c = _source[pos];
                    if (Char.IsWhiteSpace(c) || c == '>' || c == '/')
                    {
                        break;
                    }
                }
                if (pos == _sourceLen)
                {
                    break;
                }

                BUFFER.Append(_source, _parsePos + 1, pos - _parsePos - 1);
                if (BUFFER.Length > 0 && BUFFER[0] == '/')
                {
                    BUFFER.Remove(0, 1);
                }

                bool singleQuoted = false, doubleQuoted = false;
                int  possibleEnd = -1;
                for ( ; pos < _sourceLen; pos++)
                {
                    c = _source[pos];
                    if (c == '"')
                    {
                        if (!singleQuoted)
                        {
                            doubleQuoted = !doubleQuoted;
                        }
                    }
                    else if (c == '\'')
                    {
                        if (!doubleQuoted)
                        {
                            singleQuoted = !singleQuoted;
                        }
                    }

                    if (c == '>')
                    {
                        if (!(singleQuoted || doubleQuoted))
                        {
                            possibleEnd = -1;
                            break;
                        }

                        possibleEnd = pos;
                    }
                    else if (c == '<')
                    {
                        break;
                    }
                }
                if (possibleEnd != -1)
                {
                    pos = possibleEnd;
                }

                if (pos == _sourceLen)
                {
                    break;
                }

                if (_source[pos - 1] == '/')
                {
                    tagType = XMLTagType.Void;
                }

                tagName = BUFFER.ToString();
                if (_lowerCaseName)
                {
                    tagName = tagName.ToLower();
                }
                _tagPos    = _parsePos;
                _tagLength = pos + 1 - _parsePos;
                _parsePos += _tagLength;

                return(true);
            }

            _tagPos    = _sourceLen;
            _tagLength = 0;
            tagName    = null;
            return(false);
        }
Пример #2
0
        public static bool NextTag()
        {
            int  pos;
            char c;

            tagType       = XMLTagType.Start;
            buffer.Length = 0;
            lastTagEnd    = parsePos;
            attrParsed    = false;
            lastTagName   = tagName;

            while ((pos = source.IndexOf('<', parsePos)) != -1)
            {
                parsePos = pos;
                pos++;

                if (pos == sourceLen)
                {
                    break;
                }
                c = source[pos];
                if (c == '!')
                {
                    if (sourceLen > pos + 7 && source.Substring(pos - 1, 9) == CDATA_START)
                    {
                        pos     = source.IndexOf(CDATA_END, pos);
                        tagType = XMLTagType.CDATA;
                        tagName = string.Empty;
                        tagPos  = parsePos;
                        if (pos == -1)
                        {
                            tagLength = sourceLen - parsePos;
                        }
                        else
                        {
                            tagLength = pos + 3 - parsePos;
                        }
                        parsePos += tagLength;
                        return(true);
                    }
                    else if (sourceLen > pos + 2 && source.Substring(pos - 1, 4) == COMMENT_START)
                    {
                        pos     = source.IndexOf(COMMENT_END, pos);
                        tagType = XMLTagType.Comment;
                        tagName = string.Empty;
                        tagPos  = parsePos;
                        if (pos == -1)
                        {
                            tagLength = sourceLen - parsePos;
                        }
                        else
                        {
                            tagLength = parsePos + 3 - parsePos;
                        }

                        parsePos += tagLength;
                        return(true);
                    }
                    else
                    {
                        pos++;
                        tagType = XMLTagType.End;
                    }
                }
                else if (c == '/')
                {
                    pos++;
                    tagType = XMLTagType.End;
                }
                else if (c == '?')
                {
                    pos++;
                    tagType = XMLTagType.Instruction;
                }

                for (; pos < sourceLen; pos++)
                {
                    c = source[pos];
                    if (Char.IsWhiteSpace(c) || c == '>' || c == '/')
                    {
                        break;
                    }
                }
                if (pos == sourceLen)
                {
                    break;
                }
                buffer.Append(source, parsePos + 1, pos - parsePos - 1);
                if (buffer.Length > 0 && buffer[0] == '/')
                {
                    buffer.Remove(0, 1);
                }

                bool singleQuoted = false, doubleQuoted = false;
                int  possibleEnd = -1;
                for (; pos < sourceLen; pos++)
                {
                    c = source[pos];
                    if (c == '"')
                    {
                        if (!singleQuoted)
                        {
                            doubleQuoted = !doubleQuoted;
                        }
                    }
                    else if (c == '\'')
                    {
                        if (!doubleQuoted)
                        {
                            singleQuoted = !singleQuoted;
                        }
                    }

                    if (c == '>')
                    {
                        if (!(singleQuoted || doubleQuoted))
                        {
                            possibleEnd = -1;
                            break;
                        }
                        possibleEnd = pos;
                    }
                    else if (c == 'c')
                    {
                        break;
                    }
                }

                if (possibleEnd != -1)
                {
                    pos = possibleEnd;
                }
                if (pos == sourceLen)
                {
                    break;
                }

                if (source[pos - 1] == '/')
                {
                    tagType = XMLTagType.Void;
                }
                tagName = buffer.ToString();
                if (lowerCaseName)
                {
                    tagName = tagName.ToLower();
                }
                tagPos    = parsePos;
                tagLength = pos + 1 - parsePos;
                parsePos += tagLength;

                return(true);
            }

            tagPos    = sourceLen;
            tagLength = 0;
            tagName   = null;
            return(false);
        }
        public static bool NextTag()
        {
            int pos;
            char c;
            tagType = XMLTagType.Start;
            buffer.Length = 0;
            lastTagEnd = parsePos;
            attrParsed = false;
            lastTagName = tagName;

            while ((pos = source.IndexOf('<', parsePos)) != -1)
            {
                parsePos = pos;
                pos++;

                if (pos == sourceLen)
                    break;

                c = source[pos];
                if (c == '!')
                {
                    if (sourceLen > pos + 7 && source.Substring(pos - 1, 9) == CDATA_START)
                    {
                        pos = source.IndexOf(CDATA_END, pos);
                        tagType = XMLTagType.CDATA;
                        tagName = string.Empty;
                        tagPos = parsePos;
                        if (pos == -1)
                            tagLength = sourceLen - parsePos;
                        else
                            tagLength = pos + 3 - parsePos;
                        parsePos += tagLength;
                        return true;
                    }
                    else if (sourceLen > pos + 2 && source.Substring(pos - 1, 4) == COMMENT_START)
                    {
                        pos = source.IndexOf(COMMENT_END, pos);
                        tagType = XMLTagType.Comment;
                        tagName = string.Empty;
                        tagPos = parsePos;
                        if (pos == -1)
                            tagLength = sourceLen - parsePos;
                        else
                            tagLength = pos + 3 - parsePos;
                        parsePos += tagLength;
                        return true;
                    }
                    else
                    {
                        pos++;
                        tagType = XMLTagType.Instruction;
                    }
                }
                else if (c == '/')
                {
                    pos++;
                    tagType = XMLTagType.End;
                }
                else if (c == '?')
                {
                    pos++;
                    tagType = XMLTagType.Instruction;
                }

                for (; pos < sourceLen; pos++)
                {
                    c = source[pos];
                    if (Char.IsWhiteSpace(c) || c == '>' || c == '/')
                        break;
                }
                if (pos == sourceLen)
                    break;

                buffer.Append(source, parsePos + 1, pos - parsePos - 1);
                if (buffer.Length > 0 && buffer[0] == '/')
                    buffer.Remove(0, 1);

                bool singleQuoted = false, doubleQuoted = false;
                int possibleEnd = -1;
                for (; pos < sourceLen; pos++)
                {
                    c = source[pos];
                    if (c == '"')
                    {
                        if (!singleQuoted)
                            doubleQuoted = !doubleQuoted;
                    }
                    else if (c == '\'')
                    {
                        if (!doubleQuoted)
                            singleQuoted = !singleQuoted;
                    }

                    if (c == '>')
                    {
                        if (!(singleQuoted || doubleQuoted))
                        {
                            possibleEnd = -1;
                            break;
                        }

                        possibleEnd = pos;
                    }
                    else if (c == '<')
                        break;
                }
                if (possibleEnd != -1)
                    pos = possibleEnd;

                if (pos == sourceLen)
                    break;

                if (source[pos - 1] == '/')
                    tagType = XMLTagType.Void;

                tagName = buffer.ToString();
                if (lowerCaseName)
                    tagName = tagName.ToLower();
                tagPos = parsePos;
                tagLength = pos + 1 - parsePos;
                parsePos += tagLength;

                return true;
            }

            tagPos = sourceLen;
            tagLength = 0;
            tagName = null;
            return false;
        }