文章目录

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

一、nodeCompleted 方法获取节点闭合信息


在之前的博客中 , 在 BuilderSupport#createNode 方法中创建了 Xml 节点 , 在 BuilderSupport#setParent 方法中设置了 Xml 节点之间的父子关系 ;

下面还需要获取节点的闭合信息 , 节点结束时 , 需要获取到该信息 , 重写 BuilderSupport#nodeCompleted 方法 , 该方法不是抽象的方法 , 需要手动添加 , 节点结束后 , 会自动回调该方法 ;

    /*** 闭合节点时, 回调该方法* @param parent* @param node*/@Overrideprotected void nodeCompleted(Object parent, Object node) {super.nodeCompleted(parent, node)println "nodeCompleted 完成了父节点为 parent : $parent  的节点 node : $node 的闭合操作"}

自定义的 Xml 生成器核心代码如下 :

  • 首先 , 在 createNode 方法中创建 Node 节点 ;
  • 然后 , 在 setParent 方法中设置节点之间的父子关系 ;
  • 最后 , 在 nodeCompleted 方法中获取节点的闭合操作 ;
public class MyBuilderSupport extends BuilderSupport {@Overrideprotected Object createNode(Object name, Map attributes, Object value) {println "创建节点 名称 : $name, 属性 : $attributes, 值 : $value"return name;}/*** 设置节点之间的关系* @param parent Xml 中的父节点* @param child Xml 中的父节点下的子节点*/@Overrideprotected void setParent(Object parent, Object child) {println "setParent 设置子节点 ${child} 的父节点是 ${parent}"}/*** 闭合节点时, 回调该方法* @param parent* @param node*/@Overrideprotected void nodeCompleted(Object parent, Object node) {super.nodeCompleted(parent, node)println "nodeCompleted 完成了父节点为 parent : $parent  的节点 node : $node 的闭合操作"}
}

执行

// 创建自定义 Xml 构造器
def myBuilderSupport = new MyBuilderSupport()// 构建 student 根节点
myBuilderSupport.student {// 构建 student 根节点下的 name 节点// 该节点有 code: "UTF-8" 属性// 节点元素为 "Tom" 字符串name("Tom", code: "UTF-8")age(18)
}

代码后的打印结果如下 :

创建节点 名称 : 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 的闭合操作

其中我们只关注 nodeCompleted 方法中打印出的节点闭合信息 ;

在设置了 name 为 student 节点的子节点之后 , name 节点就闭合了 , 打印出

nodeCompleted 完成了父节点为 parent : student  的节点 node : name 的闭合操作

内容 , 然后在将 age 节点 设置为 student 节点的子节点之后 , 该 age 节点也闭合了 , 打印出

nodeCompleted 完成了父节点为 parent : student  的节点 node : age 的闭合操作

name 和 age 节点都闭合后 , 根节点 student 节点也随之闭合 , 整个 Xml 文件所有的节点都闭合了 ;

本博客的参考 Xml 文件数据 :

<student><name code="utf-8">Tom</name><age>18</age>
</student>

二、完整代码示例


1、MyBuilderSupport 生成器代码

import groovy.util.BuilderSupport;import java.util.Map;public class MyBuilderSupport extends BuilderSupport {/*** 设置节点之间的关系* @param parent Xml 中的父节点* @param child Xml 中的父节点下的子节点*/@Overrideprotected void setParent(Object parent, Object child) {println "setParent 设置子节点 ${child} 的父节点是 ${parent}"}@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 name;}/*** 闭合节点时, 回调该方法* @param parent* @param node*/@Overrideprotected void nodeCompleted(Object parent, Object node) {super.nodeCompleted(parent, node)println "nodeCompleted 完成了父节点为 parent : $parent  的节点 node : $node 的闭合操作"}
}

2、使用 MyBuilderSupport 生成器创建 Xml 代码

// 创建自定义 Xml 构造器
def myBuilderSupport = new MyBuilderSupport()// 构建 student 根节点
myBuilderSupport.student {// 构建 student 根节点下的 name 节点// 该节点有 code: "UTF-8" 属性// 节点元素为 "Tom" 字符串name("Tom", code: "UTF-8")age(18)
}

执行结果 :

创建节点 名称 : 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 的闭合操作

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

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

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

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

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

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

    文章目录 一.继承 BuilderSupport 抽象类 二.在 createNode 方法中获取节点名称.节点属性.节点值信息 三.完整代码示例 1.MyBuilderSupport 生成器代码 2 ...

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

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

  5. Winform中自定义xml配置文件,并配置获取文件路径

    场景 在Winform程序中,需要将一些配置项存到配置文件中,这时就需要自定义xml的配置文件格式.并在一些工具类中去获取配置文件的路径并加载其内容. 关注公众号 霸道的程序猿 获取编程相关电子书.教 ...

  6. ZooKeeper使用get命令无法获取节点版本信息

    问题描述:在项目运行时需要给节点赋值,代码如下: Stat status = zkServer.getZookeeper().setData("/testnode", " ...

  7. Asp.net Request方法获取客户端的信息

    Response.Write("客户端计算机名:" + Request.UserHostName + "<BR />");   Response.W ...

  8. JSP调用request方法获取请求相关信息

    index.jsp: <html> <body bgcolor="#FFFFF0"> 请求方式:<%=request.getMethod() %> ...

  9. Winform中自定义xml配置文件后对节点进行读取与写入

    场景 Winform中自定义xml配置文件,并配置获取文件路径: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100522648 ...

最新文章

  1. 51nod 1013【快速幂+逆元】
  2. Scheme 语言概要
  3. 面向过程和面向对象的区别
  4. java import自定义类_Java实现的自定义类加载器示例
  5. Python中定义函数的三种形式
  6. C# 子类实例化基类 基类使用不了子类的方法_老话题:6个方法,检验你有没有正确使用设计模式...
  7. VS2013出现“无法找到“xxx.exe”的调试信息,或者调试信息不匹配”错误解决方案
  8. 【LeetCode笔记】283. 移动零(Java)
  9. 2021年图灵奖公布!72岁的美国科学家 Jack Dongarra 获奖
  10. [转载] java之重写toString
  11. 使用MyEclipse建立working set
  12. 树莓派安装ftp服务器
  13. Leetcode 5
  14. 面具更新自定义_面具Magisk如何从稳定版切换到测试版,面具版本切换教程
  15. 转行做调度,你准备好了吗
  16. 纯C++编写Win32/X64通用Shellcode注入csrss进程
  17. 沧小海基于xilinx srio核的学习笔记之第四章 Xilinx SRIO的示例分析(一)
  18. 采矿工具的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  19. 注册表编辑已被管理员禁用—解决办法
  20. 广工anyview数据结构第七章(2021.12)

热门文章

  1. ecmall数据库表详解 二次开发必备
  2. oc runtime
  3. SQL Server 环形缓冲区(Ring Buffer) -- 介绍
  4. SQL Server 数据库设计
  5. 改变Eclipse主题颜色
  6. 【博客话题】我的2011项目总结
  7. 从宏观经济状况看目前股市
  8. 14种常见HTTP状态码
  9. 浏览器无法访问虚拟机的服务器
  10. async/await工作机制探究--NodeJS