总结:验证 spring 的 是需要 DTD 模式还是 XSD模式,如果包含DOCTYPE表示 DTD模式
,返回 2 表示 DTD验证模式,3 表示 XSD模式
具体看代码中注释
package org.springframework.util.xml;
import java.io.BufferedReader;
import java.io.CharConversionException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;
public class XmlValidationModeDetector {
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 static final String DOCTYPE = "DOCTYPE";
private static final String START_COMMENT = "<!--";
private static final String END_COMMENT = "-->";
private boolean inComment;
public XmlValidationModeDetector() {
}
// 验证 spring 的 是需要 DTD 模式还是 XSD模式,如果包含DOCTYPE表示 DTD模式
// 返回 2 表示 DTD验证模式,3 表示 XSD模式
public int detectValidationMode(InputStream inputStream) throws IOException {
// 包装 xml 文件流
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
byte var4;
try {
// 是否为 DTD 模式验证 XML文档
boolean isDtdValidated = false;
while(true) {
String content;
if((content = reader.readLine()) != null) {
// 判断是否为注释
content = this.consumeCommentTokens(content);
// 如果读取的行为注释 或 为空 则跳过
if(this.inComment || !StringUtils.hasText(content)) {
continue;
}
// 包含 DOCTYPE表示 DTD模式:https://blog.csdn.net/ruanhao1203/article/details/103487888
if(this.hasDoctype(content)) {
isDtdValidated = true;
} else if(!this.hasOpeningTag(content)) {
continue;
}
}
int var5 = isDtdValidated?2:3;
return var5;
}
} catch (CharConversionException var9) {
var4 = 1;
} finally {
reader.close();
}
return var4;
}
// 包含 DOCTYPE表示 DTD模式:https://blog.csdn.net/ruanhao1203/article/details/103487888
private boolean hasDoctype(String content) {
return content.contains("DOCTYPE");
}
private boolean hasOpeningTag(String content) {
if(this.inComment) {
return false;
} else {
int openTagIndex = content.indexOf(60);
return openTagIndex > -1 && content.length() > openTagIndex + 1 && Character.isLetter(content.charAt(openTagIndex + 1));
}
}
// 判断是否为注释
@Nullable
private String consumeCommentTokens(String line) {
int indexOfStartComment = line.indexOf("<!--");
if(indexOfStartComment == -1 && !line.contains("-->")) {
return line;
} else {
String result = "";
String currLine = line;
if(indexOfStartComment >= 0) {
result = line.substring(0, indexOfStartComment);
currLine = line.substring(indexOfStartComment);
}
do {
if((currLine = this.consume(currLine)) == null) {
return null;
}
} while(this.inComment || currLine.trim().startsWith("<!--"));
return result + currLine;
}
}
@Nullable
private String consume(String line) {
int index = this.inComment?this.endComment(line):this.startComment(line);
return index == -1?null:line.substring(index);
}
private int startComment(String line) {
return this.commentToken(line, "<!--", true);
}
private int endComment(String line) {
return this.commentToken(line, "-->", false);
}
private int commentToken(String line, String token, boolean inCommentIfPresent) {
int index = line.indexOf(token);
if(index > -1) {
this.inComment = inCommentIfPresent;
}
return index == -1?index:index + token.length();
}
}