博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XmlValidationModeDetector源码分析
阅读量:4012 次
发布时间:2019-05-24

本文共 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(); }}

 

 

 

你可能感兴趣的文章
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming 输出每一行句子的第三个单词
查看>>
coursesa课程 Python 3 programming Dictionary methods 字典的方法
查看>>
Returning a value from a function
查看>>
coursesa课程 Python 3 programming Functions can call other functions 函数调用另一个函数
查看>>
coursesa课程 Python 3 programming Tuple Assignment with Unpacking
查看>>
coursesa课程 Python 3 programming The while Statement
查看>>
course_2_assessment_6
查看>>
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>
coursesa课程 Python 3 programming 排序函数sorted的可选参数
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>
visca接口转RS-232C接口线序
查看>>
在unity中建立最小的shader(Minimal Shader)
查看>>
1.3 Debugging of Shaders (调试着色器)
查看>>
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
vsftp 配置具有匿名登录也有系统用户登录,系统用户有管理权限,匿名只有下载权限。
查看>>
linux安装usb wifi接收器
查看>>
关于共享单车定位不准问题
查看>>
终于搞定CString和string之间转换的问题了
查看>>
用防火墙自动拦截攻击IP
查看>>