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); }
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; }