文章目录

  • 一、继承 BuilderSupport 抽象类
  • 二、在 createNode 方法中获取节点名称、节点属性、节点值信息
  • 三、完整代码示例
    • 1、MyBuilderSupport 生成器代码
    • 2、使用 MyBuilderSupport 生成器创建 Xml 代码

一、继承 BuilderSupport 抽象类


参考 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 {@Overrideprotected void setParent(Object parent, Object child) {}@Overrideprotected Object createNode(Object name) {/*所有的 createNode 方法都回调到 3 个参数的 createNode 方法*/return createNode(name, null, null);}@Overrideprotected Object createNode(Object name, Object value) {/*所有的 createNode 方法都回调到 3 个参数的 createNode 方法*/return createNode(name, null, value);}@Overrideprotected Object createNode(Object name, Map attributes) {/*所有的 createNode 方法都回调到 3 个参数的 createNode 方法*/return createNode(name, attributes, null);}@Overrideprotected Object createNode(Object name, Map attributes, Object value) {return null;}
}

二、在 createNode 方法中获取节点名称、节点属性、节点值信息


在自定义的 MyBuilderSupport 类中 , 所有的创建节点的 createNode 方法都回调到 3 个参数的 createNode 方法

    @Overrideprotected Object createNode(Object name, Map attributes, Object value) {return null;}

因此 , 在该方法中 , 可以获取到节点的所有信息 , 包括 节点名称、节点属性、节点值信息 ;

在该方法中打印相关节点信息 :

    @Overrideprotected 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 ;

三、完整代码示例


1、MyBuilderSupport 生成器代码

import groovy.util.BuilderSupport;import java.util.Map;public class MyBuilderSupport extends BuilderSupport {@Overrideprotected void setParent(Object parent, Object child) {}@Overrideprotected Object createNode(Object name) {/*所有的 createNode 方法都回调到 3 个参数的 createNode 方法*/return createNode(name, null, null);}@Overrideprotected Object createNode(Object name, Object value) {/*所有的 createNode 方法都回调到 3 个参数的 createNode 方法*/return createNode(name, null, value);}@Overrideprotected Object createNode(Object name, Map attributes) {/*所有的 createNode 方法都回调到 3 个参数的 createNode 方法*/return createNode(name, attributes, null);}@Overrideprotected Object createNode(Object name, Map attributes, Object value) {println "$name, $attributes, $value"return null;}
}

2、使用 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

【Groovy】自定义 Xml 生成器 BuilderSupport ( 继承 BuilderSupport 抽象类 | 在 createNode 方法中获取节点名称、节点属性、节点值信息 )相关推荐

  1. 【Groovy】自定义 Xml 生成器 BuilderSupport ( nodeCompleted 方法获取节点闭合信息 )

    文章目录 一.nodeCompleted 方法获取节点闭合信息 二.完整代码示例 1.MyBuilderSupport 生成器代码 2.使用 MyBuilderSupport 生成器创建 Xml 代码 ...

  2. 【Groovy】自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )

    文章目录 一.创建 XmlNode 节点 二.管理 XmlNode 节点并将根节点转为 Xml 信息 三.完整代码示例 1.自定义 Xml 生成器 MyBuilderSupport 2.Xml 节点封 ...

  3. 【Groovy】自定义 Xml 生成器 BuilderSupport ( setParent 方法中设置父节点与子节点关系 )

    文章目录 一.setParent 方法中设置父节点与子节点关系 二.完整代码示例 1.MyBuilderSupport 生成器代码 2.使用 MyBuilderSupport 生成器创建 Xml 代码 ...

  4. 【Groovy】自定义 Xml 生成器 BuilderSupport ( 构造 Xml 节点类 | 封装节点名称、节点值、节点属性、子节点 | 将封装的节点数据转为 Xml 字符串 )

    文章目录 一.构造 Xml 节点类 1.封装节点名称.节点值.节点属性.子节点 2.将封装的节点数据转为 Xml 字符串 二.Xml 节点类完整代码 一.构造 Xml 节点类 生成 Xml 数据前 , ...

  5. java拦截器继承类_struts2的拦截器(5):继承MethodFilterInterceptor抽象类实现拦截方法的拦截器 | 学步园...

    在默认情况下,如果我们为某个Action定义了拦截器,则这个拦截器会拦截该Action内的所有方法.但在某些情况下,我们不想拦截所有的方法,我们只需要拦截某些特定方法,此时就需要使用struts2拦截 ...

  6. 10.java基础----继承、抽象类- 编程

    命名要求:1. 类名,接口名,枚举名,注解名使用大驼峰2. 变量名,方法名,包名均使用小驼峰3. 常量名全大写,多个单词下划线分割4. 名字要见名知意,如果不知道对应的英文,可以使用拼音代替.不可使用 ...

  7. 面向对象封装继承多态五大基本原则魔法方法反射

    目录 面向对象 三大基本特征 五大基本原则 魔法方法 反射 面向对象 什么是面向对象 使用模板的思想,将世界万事万物使用对象来表示一个类型 面向对象和面向过程的区别: 面向对象的不就是使用程序处理事情 ...

  8. XML文件解析(在Windows环境MFC程序中,使用自带的MSXML6.dll解析)

    主要总结一下MSXML DOM接口的应用.DOM(Document Object Model) 是微软提供的处理XML文档的一个API标准库,我们可以将其理解为一组抽象了XML文档结构的接口. MSX ...

  9. 【Groovy】xml 序列化 ( 使用 MarkupBuilder 生成 xml 数据 | 标签闭包下创建子标签 | 使用 MarkupBuilderHelper 添加 xml 注释 )

    文章目录 一.标签闭包下创建子标签 二.使用 MarkupBuilderHelper 添加 xml 注释 三.完整代码示例 一.标签闭包下创建子标签 在上一篇博客 [Groovy]xml 序列化 ( ...

最新文章

  1. PAT-乙级-1064 朋友数
  2. 2.7 迁移学习-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  3. 就读计算机科学与技术的原因,清华大学转专业数据!23个专业无人响应!深层次原因究竟是什么?...
  4. ThreadLocal以及增强
  5. 一个微服务架构的消费端
  6. 远程WEB控制MP3播放器设计(基于mini2440)
  7. Flat Tech html5 前端响应式模板
  8. JAVA 虚拟机类加载机制和字节码执行引擎
  9. DPDK官方中文文档
  10. qt开发用的人多吗_新房认筹猫腻多!开发商只是为达到这个目的才认筹,你入坑了吗?...
  11. spring MVC三种统一异常处理的方法
  12. Ubuntu 18.04 安装vsftpd
  13. 获取电信天邑TEWA-700E光猫超级密码相近系列通用方法
  14. matlab 使用 utf-8 编码
  15. python 证书-在python使用SSL(HTTPS)
  16. SDWAN组网典型应用
  17. 解决卸载CleanMyMac后通知中心仍有通知的问题
  18. SAP物料主数据采购类型对成本核算的影响
  19. 最详解泊松分布Poisson distribution
  20. Linux文件名排序

热门文章

  1. [爬虫学习笔记]C# 使用 ScrapySharp 并行下载天涯图片
  2. linux运维实战练习
  3. [20150205]分析函数ntile.txt
  4. RHEL6基础四十二之RHEL文件共享①NFS
  5. legend3---laravel中获取控制器名称和方法名称
  6. git 错误 RPC
  7. 获取系统昨日最高峰时的AWR报告,get_hight_load_awr
  8. YTU 2917: Shape系列-3
  9. Delphi在创建和使用DLL的时候如果使用到string,请引入ShareMem单元
  10. 轻量级web富文本框——wangEditor使用手册(2)——扩展一个“缩进”功能 demo