【Groovy】自定义 Xml 生成器 BuilderSupport ( nodeCompleted 方法获取节点闭合信息 )
【摘要】
文章目录
一、nodeCompleted 方法获取节点闭合信息二、完整代码示例1、MyBuilderSupport 生成器代码2、使用 MyBuilderSupport 生成器创建 Xml 代码
...
一、nodeCompleted 方法获取节点闭合信息
在之前的博客中 , 在 BuilderSupport#createNode 方法中创建了 Xml 节点 , 在 BuilderSupport#setParent 方法中设置了 Xml 节点之间的父子关系 ;
下面还需要获取节点的闭合信息 , 节点结束时 , 需要获取到该信息 , 重写 BuilderSupport#nodeCompleted 方法 , 该方法不是抽象的方法 , 需要手动添加 , 节点结束后 , 会自动回调该方法 ;
/**
* 闭合节点时, 回调该方法
* @param parent
* @param node
*/
@Override
protected void nodeCompleted(Object parent, Object node) {
super.nodeCompleted(parent, node)
println "nodeCompleted 完成了父节点为 parent : $parent 的节点 node : $node 的闭合操作"
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
自定义的 Xml 生成器核心代码如下 :
- 首先 , 在 createNode 方法中创建 Node 节点 ;
- 然后 , 在 setParent 方法中设置节点之间的父子关系 ;
- 最后 , 在 nodeCompleted 方法中获取节点的闭合操作 ;
public class MyBuilderSupport extends BuilderSupport {
@Override
protected Object createNode(Object name, Map attributes, Object value) {
println "创建节点 名称 : $name, 属性 : $attributes, 值 : $value"
return name;
}
/**
* 设置节点之间的关系
* @param parent Xml 中的父节点
* @param child Xml 中的父节点下的子节点
*/
@Override
protected void setParent(Object parent, Object child) {
println "setParent 设置子节点 ${child} 的父节点是 ${parent}"
}
/**
* 闭合节点时, 回调该方法
* @param parent
* @param node
*/
@Override
protected void nodeCompleted(Object parent, Object node) {
super.nodeCompleted(parent, node)
println "nodeCompleted 完成了父节点为 parent : $parent 的节点 node : $node 的闭合操作"
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
执行
// 创建自定义 Xml 构造器
def myBuilderSupport = new MyBuilderSupport()
// 构建 student 根节点
myBuilderSupport.student {
// 构建 student 根节点下的 name 节点
// 该节点有 code: "UTF-8" 属性
// 节点元素为 "Tom" 字符串
name("Tom", code: "UTF-8")
age(18)
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
代码后的打印结果如下 :
创建节点 名称 : student, 属性 : null, 值 : null
创建节点 名称 : name, 属性 : [code:UTF-8], 值 : Tom
setParent 设置子节点 name 的父节点是 student
nodeCompleted 完成了父节点为 parent : student 的节点 node : name 的闭合操作
创建节点 名称 : age, 属性 : null, 值 : 18
setParent 设置子节点 age 的父节点是 student
nodeCompleted 完成了父节点为 parent : student 的节点 node : age 的闭合操作
nodeCompleted 完成了父节点为 parent : null 的节点 node : student 的闭合操作
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
其中我们只关注 nodeCompleted 方法中打印出的节点闭合信息 ;
在设置了 name 为 student 节点的子节点之后 , name 节点就闭合了 , 打印出
nodeCompleted 完成了父节点为 parent : student 的节点 node : name 的闭合操作
- 1
内容 , 然后在将 age 节点 设置为 student 节点的子节点之后 , 该 age 节点也闭合了 , 打印出
nodeCompleted 完成了父节点为 parent : student 的节点 node : age 的闭合操作
- 1
name 和 age 节点都闭合后 , 根节点 student 节点也随之闭合 , 整个 Xml 文件所有的节点都闭合了 ;
本博客的参考 Xml 文件数据 :
<student>
<name code="utf-8">Tom</name>
<age>18</age>
</student>
- 1
- 2
- 3
- 4
二、完整代码示例
1、MyBuilderSupport 生成器代码
import groovy.util.BuilderSupport;
import java.util.Map;
public class MyBuilderSupport extends BuilderSupport {
/**
* 设置节点之间的关系
* @param parent Xml 中的父节点
* @param child Xml 中的父节点下的子节点
*/
@Override
protected void setParent(Object parent, Object child) {
println "setParent 设置子节点 ${child} 的父节点是 ${parent}"
}
@Override
protected Object createNode(Object name) {
/*
所有的 createNode 方法都回调到 3 个参数的 createNode 方法
*/
return createNode(name, null, null);
}
@Override
protected Object createNode(Object name, Object value) {
/*
所有的 createNode 方法都回调到 3 个参数的 createNode 方法
*/
return createNode(name, null, value);
}
@Override
protected Object createNode(Object name, Map attributes) {
/*
所有的 createNode 方法都回调到 3 个参数的 createNode 方法
*/
return createNode(name, attributes, null);
}
@Override
protected Object createNode(Object name, Map attributes, Object value) {
println "创建节点 名称 : $name, 属性 : $attributes, 值 : $value"
return name;
}
/**
* 闭合节点时, 回调该方法
* @param parent
* @param node
*/
@Override
protected void nodeCompleted(Object parent, Object node) {
super.nodeCompleted(parent, node)
println "nodeCompleted 完成了父节点为 parent : $parent 的节点 node : $node 的闭合操作"
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
2、使用 MyBuilderSupport 生成器创建 Xml 代码
// 创建自定义 Xml 构造器
def myBuilderSupport = new MyBuilderSupport()
// 构建 student 根节点
myBuilderSupport.student {
// 构建 student 根节点下的 name 节点
// 该节点有 code: "UTF-8" 属性
// 节点元素为 "Tom" 字符串
name("Tom", code: "UTF-8")
age(18)
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
执行结果 :
创建节点 名称 : student, 属性 : null, 值 : null
创建节点 名称 : name, 属性 : [code:UTF-8], 值 : Tom
setParent 设置子节点 name 的父节点是 student
nodeCompleted 完成了父节点为 parent : student 的节点 node : name 的闭合操作
创建节点 名称 : age, 属性 : null, 值 : 18
setParent 设置子节点 age 的父节点是 student
nodeCompleted 完成了父节点为 parent : student 的节点 node : age 的闭合操作
nodeCompleted 完成了父节点为 parent : null 的节点 node : student 的闭合操作
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/122856816
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)