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()
是一个通用的子占位符解析器,内部定义了openToken
和closeToken
记录占位符的开启和关闭,然后对字符串进行顺序查找解析得到占位符的字面值,将这个字面值的解析交给TokenHandler
,拿到结果后拼装成完整的字符串返回。
TokenHandler
的实现有:
- VariableTokenHandler
- ParameterMappingTokenHandler
- DynamicCheckerTokenParser
- BindingTokenParser
VariableTokenHandler.handleToken()
的实现方法如下:
${username:"root"}
按照默认分隔符:
将其分割为username
和root
,前者是占位符,后者是默认值。
在variables集合中查找username,如果没有,则使用root作为默认值
evalNode()
返回值是XNode类型,对dom.Node做了封装,其构造函数中会调用parseAttributes()和parseBody()解析Node对象中的信息,初始化attributes集合和body字段。
XNode中提供了get*()来获取各种信息,以及eval*()方法来解析(调用封装的XPathParse对象的方法)