前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Groovy】自定义 Xml 生成器 BuilderSupport ( 构造 Xml 节点类 | 封装节点名称、节点值、节点属性、子节点 | 将封装的节点数据转为 Xml 字符串 )

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

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

文章目录

一、构造 Xml 节点类


生成 Xml 数据前 , 首先要将 Xml 数据封装起来 , 先手机 Xml 的各个层级节点的信息 , 最后利用这些节点信息生成 Xml 数据 ;

参考下面的 xml 文件构造节点类 ;

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

1、封装节点名称、节点值、节点属性、子节点

定义 XmlNode 类 , 使用该类代表节点

  • 封装 String 类型的的名称 :
代码语言:javascript
复制
    /**
     * 节点名称
     */
    String name
  • 封装 String 类型的节点值 :
代码语言:javascript
复制
    /**
     * 节点值
     */
    String value
  • 封装 Map 类型的节点属性 :
代码语言:javascript
复制
    /**
     * 节点属性
     */
    Map attributes
  • 封装子节点信息 : 每个节点下可能有多个子节点 , 因此该子节点是一个 ArrayList 集合 ;
代码语言:javascript
复制
    /**
     * 子节点 ArrayList 类型
     */
    def children = []

2、将封装的节点数据转为 Xml 字符串

参考下面的 xml 文件 , 开发 转换 Xml 数据方法 ;

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

节点有

2

种情况 , 带属性的节点和不带属性的节点 ,

  • ① 带属性的节点 <name code="utf-8">Tom</name>
  • ② 不带属性的节点 <age/>

使用给定的 Writer writer 输出 Xml 信息 ;

<name code="utf-8">Tom</name> 为例 , 先输出 <name 信息 ,

代码语言:javascript
复制
writer.write("<${name}")

假如该节点有节点属性信息 , 循环写出节点属性 ;

代码语言:javascript
复制
        /*
            假如该节点有节点属性信息
            循环写出节点属性
         */
        if (attributes != null) {
            attributes.each {
                writer.write(" ${it.key}='${it.value}'")
            }
        }

节点值以及子节点输出可能有如下

5

种情况 :

  • 节点有值, 没有子节点
  • 节点没有值, 没有子节点
  • 节点有值, 有子节点
  • 节点没有值, 有子节点
  • 既没有值有没有子节点
代码语言:javascript
复制
        if (value != null || children != null) {
            // 处理前 4 种情况

            writer.write(">")

            if (value != null){
                writer.write("${value}")
            }

            if (children != null) {
                children.each {
                    it.build(writer)
                }
            }

            // 节点收尾
            writer.write("</${name}>")

        } else {
            // 既没有值有没有子节点的情况
            // <age/> , 之前写出了 "<age" , 现在写出 "/>"
            writer.write("/>")
        }

二、Xml 节点类完整代码


代码语言:javascript
复制
class XmlNode {
    /**
     * 节点名称
     */
    String name

    /**
     * 节点值
     */
    String value

    /**
     * 节点属性
     */
    Map attributes

    /**
     * 子节点 ArrayList 类型
     */
    def children = []


    XmlNode(String name, String value, Map attributes) {
        this.name = name
        this.value = value
        this.attributes = attributes
    }


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

    /**
     * 写出该 XmlNode 节点数据
     * @param writer
     */
    def build(Writer writer) {
        /*
            写出 name 节点名称
            注意 : 此处有 2 种情况
            ① 带属性的节点 <name code="utf-8">Tom</name>
            ② 不带属性的节点 <age/>
            先写出 "<name"
         */
        writer.write("<${name}")

        /*
            假如该节点有节点属性信息
            循环写出节点属性
         */
        if (attributes != null) {
            attributes.each {
                writer.write(" ${it.key}='${it.value}'")
            }
        }

        /*
            可能有如下情况
            节点有值, 没有子节点
            节点没有值, 没有子节点
            节点有值, 有子节点
            节点没有值, 有子节点
            既没有值有没有子节点
            要兼顾处理上述 5 种情况
         */
        if (value != null || children != null) {
            // 处理前 4 种情况

            writer.write(">")

            if (value != null){
                writer.write("${value}")
            }

            if (children != null) {
                children.each {
                    it.build(writer)
                }
            }

            // 节点收尾
            writer.write("</${name}>")

        } else {
            // 既没有值有没有子节点的情况
            // <age/> , 之前写出了 "<age" , 现在写出 "/>"
            writer.write("/>")
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、构造 Xml 节点类
    • 1、封装节点名称、节点值、节点属性、子节点
      • 2、将封装的节点数据转为 Xml 字符串
      • 二、Xml 节点类完整代码
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档