in nbxml/src/main/java/org/apache/vysper/xml/sax/impl/XMLParser.java [128:304]
public void token(char c, String token) throws SAXException {
if (log.isTraceEnabled()) {
String s = (token == null) ? Character.toString(c) : token;
log.trace("Parser got token {} in state {}", s, state);
}
switch (state) {
case START:
if (c == '<') {
state = State.IN_TAG;
attributes = new HashMap<String, String>();
} else {
characters(token);
}
break;
case IN_TAG:
// token must be element name or / for a end tag
if (c == '/') {
state = State.IN_END_TAG;
} else if (c == '?') {
state = State.IN_DECLARATION;
xmlDeclaration();
} else if (c == '!') {
if (commentsAllowed) {
state = State.AFTER_COMMENT_BANG;
} else {
fatalError("Comments not allowed");
return;
}
} else {
if (token != null && isValidName(token)) {
qname = token;
state = State.AFTER_START_NAME;
} else {
if(token != null) {
fatalError("Invalid element name: " + qname);
} else {
fatalError("Not well-formed start tag");
}
return;
}
}
break;
case IN_END_TAG:
// token must be element name
qname = token;
state = State.AFTER_END_NAME;
break;
case AFTER_START_NAME:
// token must be attribute name or > or /
if (c == '>') {
// end of start or end tag
if (state == State.AFTER_START_NAME) {
startElement();
state = State.START;
attributes = null;
} else if (state == State.AFTER_END_NAME) {
state = State.START;
endElement();
}
} else if (c == '/') {
state = State.IN_EMPTY_TAG;
} else {
// must be attribute name
attributeName = token;
state = State.AFTER_ATTRIBUTE_NAME;
}
break;
case AFTER_ATTRIBUTE_NAME:
// token must be =
if (c == '=') {
state = State.AFTER_ATTRIBUTE_EQUALS;
} else {
fatalError("Not wellformed");
}
break;
case AFTER_ATTRIBUTE_EQUALS:
// token must be " or '
if (c == '"' || c == '\'') {
state = State.AFTER_ATTRIBUTE_FIRST_QUOTE;
}
break;
case AFTER_ATTRIBUTE_FIRST_QUOTE:
// token must be attribute value
attributes.put(attributeName, unescape(token));
state = State.AFTER_ATTRIBUTE_VALUE;
break;
case AFTER_ATTRIBUTE_VALUE:
// token must be " or '
if (c == '"' || c == '\'') {
state = State.AFTER_START_NAME;
} else {
fatalError("Not wellformed");
}
break;
case AFTER_END_NAME:
// token must be >
if (c == '>') {
state = State.START;
endElement();
}
break;
case IN_EMPTY_TAG:
// token must be >
if (c == '>') {
startElement();
attributes = null;
if (state != State.CLOSED) {
state = State.START;
endElement();
}
}
break;
case AFTER_COMMENT_BANG:
// token must be -
if (c == '-') {
state = State.AFTER_COMMENT_DASH1;
} else {
fatalError("Comment not wellformed");
return;
}
break;
case AFTER_COMMENT_DASH1:
// token must be -
if (c == '-') {
state = State.AFTER_COMMENT_DASH2;
} else {
fatalError("Comment not wellformed");
return;
}
break;
case AFTER_COMMENT_DASH2:
// we should now get the comment content, ignore
if (c == '-') {
state = State.AFTER_COMMENT_CLOSING_DASH1;
} else {
state = State.AFTER_COMMENT;
}
break;
case AFTER_COMMENT:
// token must be - or some text
if (c == '-') {
state = State.AFTER_COMMENT_CLOSING_DASH1;
} else if (c == '>') {
fatalError("Comment not wellformed");
return;
} else {
// ignore
}
break;
case AFTER_COMMENT_CLOSING_DASH1:
// token must be -
if (c == '-') {
state = State.AFTER_COMMENT_CLOSING_DASH2;
} else {
fatalError("Comment not wellformed");
return;
}
break;
case AFTER_COMMENT_CLOSING_DASH2:
// token must be >
if (c == '>') {
state = State.START;
} else {
fatalError("Comment not wellformed");
return;
}
break;
case IN_DECLARATION:
// wait for >
if (c == '>') {
state = State.START;
}
break;
}
}