本文共 3497 字,大约阅读时间需要 11 分钟。
总结:验证 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 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(" ")) { 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(" ", 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(); }}