【Groovy】自定义 Xml 生成器 BuilderSupport ( setParent 方法中设置父节点与子节点关系 )
一、setParent 方法中设置父节点与子节点关系
在自定义的 Xml 生成器 MyBuilderSupport 中的 setParent 方法是设置节点之间父子关系的方法 , 在调用了 Object createNode(Object name, Map attributes, Object value)
方法返回非空值后 , 会自动回调该方法 ;
( 注意 : 一定要返回非空值 )
public class MyBuilderSupport extends BuilderSupport {
/**
* 设置节点之间的关系
* @param parent Xml 中的父节点
* @param child Xml 中的父节点下的子节点
*/
@Override
protected void setParent(Object parent, Object child) {
println "setParent parent : ${parent} , child : ${child}"
}
@Override
protected Object createNode(Object name, Map attributes, Object value) {
println "$name, $attributes, $value"
return name;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
调用
// 创建自定义 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
代码 , 创建 Xml 数据 , 输出结果如下 :
student, null, null
name, [code:UTF-8], Tom
setParent parent : student , child : name
age, null, 18
setParent parent : student , child : age
- 1
- 2
- 3
- 4
- 5
创建 <student>
根节点时 , 在 createNode
方法中 , 输出 student, null, null
内容 , 说明该节点只有节点名称 , 没有节点属性与节点值 ;
创建 <name>
节点时 , 输出
name, [code:UTF-8], Tom
setParent parent : student , child : name
- 1
- 2
该节点名称 name , 属性 [code:UTF-8]
, 节点值 “Tom” , 创建完毕后 , 在 MyBuilderSupport 生成器的 setParent
方法中 , 输出 setParent parent : student , child : name
, student
节点是父节点 , name
节点是子节点 ;
创建 <age>
节点时 , 输出
age, null, 18
setParent parent : student , child : age
- 1
- 2
该节点名称是 age , 属性 为空 , 值为 18 ;
创建完毕后 , 在 MyBuilderSupport 生成器的 setParent
方法中 , 输出 setParent parent : student , child : age
, student
节点是父节点 , age
节点是子节点 ;
二、完整代码示例
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 parent : ${parent} , child : ${child}"
}
@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;
}
}
- 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
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 parent : student , child : name
age, null, 18
setParent parent : student , child : age
- 1
- 2
- 3
- 4
- 5
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/122854372
- 点赞
- 收藏
- 关注作者
评论(0)