前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Groovy】自定义 Xml 生成器 BuilderSupport ( nodeCompleted 方法获取节点闭合信息 )

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

作者头像
韩曙亮
发布2023-03-30 11:15:01
4390
发布2023-03-30 11:15:01
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

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


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

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

代码语言:javascript
复制
    /**
     * 闭合节点时, 回调该方法
     * @param parent
     * @param node
     */
    @Override
    protected void nodeCompleted(Object parent, Object node) {
        super.nodeCompleted(parent, node)
        println "nodeCompleted 完成了父节点为 parent : $parent  的节点 node : $node 的闭合操作"
    }

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

  • 首先 , 在 createNode 方法中创建 Node 节点 ;
  • 然后 , 在 setParent 方法中设置节点之间的父子关系 ;
  • 最后 , 在 nodeCompleted 方法中获取节点的闭合操作 ;
代码语言:javascript
复制
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 的闭合操作"
    }
}

执行

代码语言:javascript
复制
// 创建自定义 Xml 构造器
def myBuilderSupport = new MyBuilderSupport()

// 构建 student 根节点
myBuilderSupport.student {
    // 构建 student 根节点下的 name 节点
    // 该节点有 code: "UTF-8" 属性
    // 节点元素为 "Tom" 字符串
    name("Tom", code: "UTF-8")

    age(18)
}

代码后的打印结果如下 :

代码语言:javascript
复制
创建节点 名称 : 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 节点就闭合了 , 打印出

代码语言:javascript
复制
nodeCompleted 完成了父节点为 parent : student  的节点 node : name 的闭合操作

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

代码语言:javascript
复制
nodeCompleted 完成了父节点为 parent : student  的节点 node : age 的闭合操作

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

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

代码语言:javascript
复制
<student>
  <name code="utf-8">Tom</name>
  <age>18</age>
</student>

二、完整代码示例


1、MyBuilderSupport 生成器代码

代码语言:javascript
复制
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 的闭合操作"
    }
}

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

代码语言:javascript
复制
// 创建自定义 Xml 构造器
def myBuilderSupport = new MyBuilderSupport()

// 构建 student 根节点
myBuilderSupport.student {
    // 构建 student 根节点下的 name 节点
    // 该节点有 code: "UTF-8" 属性
    // 节点元素为 "Tom" 字符串
    name("Tom", code: "UTF-8")

    age(18)
}

执行结果 :

代码语言:javascript
复制
创建节点 名称 : 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 的闭合操作
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、nodeCompleted 方法获取节点闭合信息
  • 二、完整代码示例
    • 1、MyBuilderSupport 生成器代码
      • 2、使用 MyBuilderSupport 生成器创建 Xml 代码
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档