这个类决定xml文件的验证模式
核心方法为detectValidationMode,获取一个指定xml文件的输入流,读取其中的验证模式。
/**
校验inputStream,如果xml文件含有doctype,则是dtd约束(返回2),否则是xsd约束(返回3)
*/
public int detectValidationMode(InputStream inputStream) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
byte var4;
try {
boolean isDtdValidated = false;
while(true) {
String content;
if((content = reader.readLine()) != null) {
content = this.consumeCommentTokens(content);
//上一行和下3行,作用是忽略注释行
if(this.inComment || !StringUtils.hasText(content)) {
continue;
}
if(this.hasDoctype(content)) {
isDtdValidated = true;//这一行含有DOCTYPE
} else if(!this.hasOpeningTag(content)) {//hasOpeningTag方法会校验,如果这一行有<,并且<后面跟着的是字母,则返回true。
continue;
}
}
int var5 = isDtdValidated?2:3;
return var5;
}
} catch (CharConversionException var9) {
var4 = 1;
} finally {
reader.close();
}
return var4;
}
public static final int VALIDATION_NONE = 0;
public static final int VALIDATION_AUTO = 1;
public static final int VALIDATION_DTD = 2;
public static final int VALIDATION_XSD = 3;
private String consumeCommentTokens(String line) {
if(!line.contains("<!--") && !line.contains("-->")) {//如果这一行不包含注释标记,则直接把这一行返回
return line;
} else {
do {//包含标记的话,进入consume方法,进一步判断
if((line = this.consume(line)) == null) {
return line;
}
} while(this.inComment || line.trim().startsWith("<!--"));
return line;
}
}
//如果包含头标记,则返回头标记以后的内容;如果包含结束标记,则返回标记后面的内容。
private String consume(String line) {
int index = this.inComment?this.endComment(line):this.startComment(line);
return index == -1?null:line.substring(index);
}