参考 Xml 生成器 MarkupBuilder , 自定义开发一个 Xml 生成器 ;
public class MarkupBuilder extends BuilderSupport {
}
创建 MyBuilderSupport 类 , 继承 BuilderSupport 抽象类 , 并实现如下抽象方法
protected abstract void setParent(Object parent, Object child);
protected abstract Object createNode(Object name);
protected abstract Object createNode(Object name, Object value);
protected abstract Object createNode(Object name, Map attributes);
protected abstract Object createNode(Object name, Map attributes, Object value);
令所有的 createNode 方法都回调到 3 个参数的 createNode 方法 ;
import groovy.util.BuilderSupport;
import java.util.Map;
public class MyBuilderSupport extends BuilderSupport {
@Override
protected void setParent(Object parent, Object 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) {
return null;
}
}
在自定义的 MyBuilderSupport 类中 , 所有的创建节点的 createNode 方法都回调到 3 个参数的 createNode 方法
@Override
protected Object createNode(Object name, Map attributes, Object value) {
return null;
}
因此 , 在该方法中 , 可以获取到节点的所有信息 , 包括 节点名称、节点属性、节点值信息 ;
在该方法中打印相关节点信息 :
@Override
protected Object createNode(Object name, Map attributes, Object value) {
println "$name, $attributes, $value"
return null;
}
在 Groovy 脚本中 , 创建自定义 Xml 生成器 MyBuilderSupport 对象 , 并使用闭包描述要创建的 Xml 文件 ;
// 创建自定义 Xml 构造器
def myBuilderSupport = new MyBuilderSupport()
// 构建 student 根节点
myBuilderSupport.student {
// 构建 student 根节点下的 name 节点
// 该节点有 code: "UTF-8" 属性
// 节点元素为 "Tom" 字符串
name("Tom", code: "UTF-8")
}
打印结果如下 :
student, null, null
name, [code:UTF-8], Tom
使用 myBuilderSupport.student
构建 student 根节点时 , 该节点没有值和属性 , 因此打印结果为 student, null, null
, 只打印了 name 名称 ;
使用 name("Tom", code: "UTF-8")
构建 name 节点 , 该节点的名称是 name
, 属性值是 code:UTF-8
, 节点的值为 “Tom” , 打印结果为 name, [code:UTF-8], Tom
;
import groovy.util.BuilderSupport;
import java.util.Map;
public class MyBuilderSupport extends BuilderSupport {
@Override
protected void setParent(Object parent, Object 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 null;
}
}
// 创建自定义 Xml 构造器
def myBuilderSupport = new MyBuilderSupport()
// 构建 student 根节点
myBuilderSupport.student {
// 构建 student 根节点下的 name 节点
// 该节点有 code: "UTF-8" 属性
// 节点元素为 "Tom" 字符串
name("Tom", code: "UTF-8")
}
执行结果 :
student, null, null
name, [code:UTF-8], Tom