解析器模块,使用xpath对xml进行解析
将XML一次性加载到内存中构造树形结构,操作简单,但内存占用大
部分加载,加载到某类型节点时会调用对应注册的回调函数,只能向后单向进行,且无法提供写操作
JDK提供的API,类似SAX,将XML文档作为一个事件流处理,由应用程序控制解析器进行解析,可以随时停止
XML查询语言,XPaht与XML的关系相当于SQL语言与数据库之间的关系
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()是一个通用的子占位符解析器,内部定义了openToken和closeToken记录占位符的开启和关闭,然后对字符串进行顺序查找解析得到占位符的字面值,将这个字面值的解析交给TokenHandler,拿到结果后拼装成完整的字符串返回。
TokenHandler的实现有:
VariableTokenHandlerParameterMappingTokenHandlerDynamicCheckerTokenParserBindingTokenParserVariableTokenHandler.handleToken()的实现方法如下:
${username:"root"}按照默认分隔符:将其分割为username和root,前者是占位符,后者是默认值。 在variables集合中查找username,如果没有,则使用root作为默认值
evalNode()返回值是XNode类型,对dom.Node做了封装,其构造函数中会调用parseAttributes()和parseBody()解析Node对象中的信息,初始化attributes集合和body字段。 XNode中提供了get*()来获取各种信息,以及eval*()方法来解析(调用封装的XPathParse对象的方法)