Mybatis源码解析——XPathParse

XPathParse

解析器模块,使用xpath对xml进行解析

Dom

将XML一次性加载到内存中构造树形结构,操作简单,但内存占用大

SAX

部分加载,加载到某类型节点时会调用对应注册的回调函数,只能向后单向进行,且无法提供写操作

StAX

JDK提供的API,类似SAX,将XML文档作为一个事件流处理,由应用程序控制解析器进行解析,可以随时停止

XPath

XML查询语言,XPaht与XML的关系相当于SQL语言与数据库之间的关系

XPathParse

  private final Document document;
  private boolean validation;
  private EntityResolver entityResolver;
  private Properties variables;
  private XPath xpath;

XMLMapperEntityResolver()主要用来加载DTD文件

如下所示提供了一系列eva*的方法对基本类型及String、node类型进行解析


  public Boolean evalBoolean(String expression) {
    return evalBoolean(document, expression);
  }

  public Boolean evalBoolean(Object root, String expression) {
    return (Boolean) evaluate(expression, root, XPathConstants.BOOLEAN);
  }

对于evalString()会使用PropertyParser.parse处理默认值


public String evalString(Object root, String expression) {
    String result = (String) evaluate(expression, root, XPathConstants.STRING);
    result = PropertyParser.parse(result, variables);
    return result;
  }

PropertyParser中指定了是否启用默认值(默认关闭)和默认的分隔符(默认:
其对默认值的处理会委托给GenericTokenParse()处理
GenericTokenParse()是一个通用的子占位符解析器,内部定义了openTokencloseToken记录占位符的开启和关闭,然后对字符串进行顺序查找解析得到占位符的字面值,将这个字面值的解析交给TokenHandler,拿到结果后拼装成完整的字符串返回。

TokenHandler的实现有:

  • VariableTokenHandler
  • ParameterMappingTokenHandler
  • DynamicCheckerTokenParser
  • BindingTokenParser

VariableTokenHandler.handleToken()的实现方法如下:

${username:"root"}

按照默认分隔符:将其分割为usernameroot,前者是占位符,后者是默认值。
在variables集合中查找username,如果没有,则使用root作为默认值

evalNode()返回值是XNode类型,对dom.Node做了封装,其构造函数中会调用parseAttributes()和parseBody()解析Node对象中的信息,初始化attributes集合和body字段。
XNode中提供了get*()来获取各种信息,以及eval*()方法来解析(调用封装的XPathParse对象的方法)

发布了98 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Mutou_ren/article/details/102837842
今日推荐