前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Groovy】自定义 Xml 生成器 BuilderSupport ( 继承 BuilderSupport 抽象类 | 在 createNode 方法中获取节点名称、节点属性、节点值信息 )

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

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

文章目录

一、继承 BuilderSupport 抽象类


参考 Xml 生成器 MarkupBuilder , 自定义开发一个 Xml 生成器 ;

代码语言:javascript
复制
public class MarkupBuilder extends BuilderSupport {
}

创建 MyBuilderSupport 类 , 继承 BuilderSupport 抽象类 , 并实现如下抽象方法

代码语言:javascript
复制
    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 方法 ;

代码语言:javascript
复制
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;
    }
}

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


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

代码语言:javascript
复制
    @Override
    protected Object createNode(Object name, Map attributes, Object value) {
        return null;
    }

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

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

代码语言:javascript
复制
    @Override
    protected Object createNode(Object name, Map attributes, Object value) {
        println "$name, $attributes, $value"
        return null;
    }

在 Groovy 脚本中 , 创建自定义 Xml 生成器 MyBuilderSupport 对象 , 并使用闭包描述要创建的 Xml 文件 ;

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

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

打印结果如下 :

代码语言:javascript
复制
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 生成器代码

代码语言:javascript
复制
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;
    }
}

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

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

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

执行结果 :

代码语言:javascript
复制
student, null, null
name, [code:UTF-8], Tom
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、继承 BuilderSupport 抽象类
  • 二、在 createNode 方法中获取节点名称、节点属性、节点值信息
  • 三、完整代码示例
    • 1、MyBuilderSupport 生成器代码
      • 2、使用 MyBuilderSupport 生成器创建 Xml 代码
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档