XmlValidationModeDetector源码分析

总结:验证 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();
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值