【Groovy】自定义 Xml 生成器 BuilderSupport ( 构造 Xml 节点类 | 封装节点名称、节点值、节点属性、子节点 | 将封装的节点数据转为 Xml 字符串 )
文章目录
- 一、构造 Xml 节点类
- 1、封装节点名称、节点值、节点属性、子节点
- 2、将封装的节点数据转为 Xml 字符串
- 二、Xml 节点类完整代码
一、构造 Xml 节点类
生成 Xml 数据前 , 首先要将 Xml 数据封装起来 , 先手机 Xml 的各个层级节点的信息 , 最后利用这些节点信息生成 Xml 数据 ;
参考下面的 xml 文件构造节点类 ;
<student><name code="utf-8">Tom</name><age>18</age>
</student>
1、封装节点名称、节点值、节点属性、子节点
定义 XmlNode 类 , 使用该类代表节点
- 封装 String 类型的的名称 :
/*** 节点名称*/String name
- 封装 String 类型的节点值 :
/*** 节点值*/String value
- 封装 Map 类型的节点属性 :
/*** 节点属性*/Map attributes
- 封装子节点信息 : 每个节点下可能有多个子节点 , 因此该子节点是一个 ArrayList 集合 ;
/*** 子节点 ArrayList 类型*/def children = []
2、将封装的节点数据转为 Xml 字符串
参考下面的 xml 文件 , 开发 转换 Xml 数据方法 ;
<student><name code="utf-8">Tom</name><age>18</age>
</student>
节点有 222 种情况 , 带属性的节点和不带属性的节点 ,
- ① 带属性的节点
<name code="utf-8">Tom</name>
- ② 不带属性的节点
<age/>
使用给定的 Writer writer 输出 Xml 信息 ;
以 <name code="utf-8">Tom</name>
为例 , 先输出 <name
信息 ,
writer.write("<${name}")
假如该节点有节点属性信息 , 循环写出节点属性 ;
/*假如该节点有节点属性信息循环写出节点属性*/if (attributes != null) {attributes.each {writer.write(" ${it.key}='${it.value}'")}}
节点值以及子节点输出可能有如下 555 种情况 :
- 节点有值, 没有子节点
- 节点没有值, 没有子节点
- 节点有值, 有子节点
- 节点没有值, 有子节点
- 既没有值有没有子节点
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 节点类完整代码
class XmlNode {/*** 节点名称*/String name/*** 节点值*/String value/*** 节点属性*/Map attributes/*** 子节点 ArrayList 类型*/def children = []XmlNode(String name, String value, Map attributes) {this.name = namethis.value = valuethis.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("/>")}}
}
【Groovy】自定义 Xml 生成器 BuilderSupport ( 构造 Xml 节点类 | 封装节点名称、节点值、节点属性、子节点 | 将封装的节点数据转为 Xml 字符串 )相关推荐
- 【Groovy】自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )
文章目录 一.创建 XmlNode 节点 二.管理 XmlNode 节点并将根节点转为 Xml 信息 三.完整代码示例 1.自定义 Xml 生成器 MyBuilderSupport 2.Xml 节点封 ...
- sqlserver中将行数据转为Xml文件格式
将sqlserver中的某张表中的行数据转为XML格式的文件的方法: 语法:select * from 表名 for xml path(xml文件中父节点的名称) 案例: // 在Movie数 ...
- 【Groovy】自定义 Xml 生成器 BuilderSupport ( nodeCompleted 方法获取节点闭合信息 )
文章目录 一.nodeCompleted 方法获取节点闭合信息 二.完整代码示例 1.MyBuilderSupport 生成器代码 2.使用 MyBuilderSupport 生成器创建 Xml 代码 ...
- 【Groovy】自定义 Xml 生成器 BuilderSupport ( setParent 方法中设置父节点与子节点关系 )
文章目录 一.setParent 方法中设置父节点与子节点关系 二.完整代码示例 1.MyBuilderSupport 生成器代码 2.使用 MyBuilderSupport 生成器创建 Xml 代码 ...
- 【Groovy】自定义 Xml 生成器 BuilderSupport ( 继承 BuilderSupport 抽象类 | 在 createNode 方法中获取节点名称、节点属性、节点值信息 )
文章目录 一.继承 BuilderSupport 抽象类 二.在 createNode 方法中获取节点名称.节点属性.节点值信息 三.完整代码示例 1.MyBuilderSupport 生成器代码 2 ...
- 将数据库表中数据转为XML
SQL语句如下: View Code 1 CREATE TABLE #CUSTOMER( 2 ID INT NOT NULL, 3 NAME VARCHAR(30), 4 TELE VARCHAR(9 ...
- springboot支持返回数据为xml格式
/*** 返回xml格式数据,需要前端设置请求头Accept包含application/xml* @return*/@GetMapping(value = "getConfig", ...
- 【Groovy】xml 序列化 ( 使用 MarkupBuilder 生成 xml 数据 | 设置 xml 标签内容 | 设置 xml 标签属性 )
文章目录 一.使用 MarkupBuilder 生成 xml 数据 二.完整代码示例 一.使用 MarkupBuilder 生成 xml 数据 生成 <student><name c ...
- [转]获取xml节点值和属性值(兼容ie和firefox)
本文转自:http://www.gerenzhanzhang.cn/post/%E8%8E%B7%E5%8F%96xox%EF%BC%89.aspx 原文如下: ie和firefox中对xml的操 ...
最新文章
- 博士生宿舍条件太好,本科生因疫情暂住惊到结巴!网友:不然咱读个博?
- python使用matplotlib可视化、为可视化图像的X轴和Y轴设置自定义的轴标签(axis labels of matplotlib plot)
- windbg检测句柄泄露(定位到具体代码)
- 函数的递推matlab,关于递推最小二乘法辨识参数的matlab编程(含注释)
- Puzzle 18 - StringCheese - byte storage
- 某同学正为自己安装不上sqlserver数据库而愁眉苦脸,使用朋友给的方法顿时喜笑颜开,那么朋友到底出了个什么样的方法呢?...
- python画锯齿波_用Python控制硬件35-自制二三十元成本的信号测量采集控制系统
- ble l2cap 工作过程_BLE 链路层报文详解
- c语言指针交换字符串组,c语言 指针交换两个字符串
- c#的const可以用于引用类型吗
- 蛮牛精选七款Unity插件
- java模板beetl引擎_模板引擎-beetl
- python 更换列名
- H3C华三交换机初始化配置V7版
- 在windows系统调试ydlidar详细记录(物联网机器人方向)
- 两种方法模仿支付宝进入到后台界面模糊
- 贷记、借记、来帐、往账的区别
- mysql 不支持分区_MySQL分区表的局限和限制
- 【GameMaker】分离文件路径、文件名、后缀
- 普通家庭,千万不要投入大量时间和金钱,让孩子去苦学和培养AI机器人编程了...