文章目录

  • 一、构造 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 字符串 )相关推荐

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

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

  2. sqlserver中将行数据转为Xml文件格式

    将sqlserver中的某张表中的行数据转为XML格式的文件的方法: 语法:select * from  表名   for xml path(xml文件中父节点的名称) 案例: //  在Movie数 ...

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

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

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

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

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

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

  6. 将数据库表中数据转为XML

    SQL语句如下: View Code 1 CREATE TABLE #CUSTOMER( 2 ID INT NOT NULL, 3 NAME VARCHAR(30), 4 TELE VARCHAR(9 ...

  7. springboot支持返回数据为xml格式

    /*** 返回xml格式数据,需要前端设置请求头Accept包含application/xml* @return*/@GetMapping(value = "getConfig", ...

  8. 【Groovy】xml 序列化 ( 使用 MarkupBuilder 生成 xml 数据 | 设置 xml 标签内容 | 设置 xml 标签属性 )

    文章目录 一.使用 MarkupBuilder 生成 xml 数据 二.完整代码示例 一.使用 MarkupBuilder 生成 xml 数据 生成 <student><name c ...

  9. [转]获取xml节点值和属性值(兼容ie和firefox)

    本文转自:http://www.gerenzhanzhang.cn/post/%E8%8E%B7%E5%8F%96xox%EF%BC%89.aspx 原文如下:   ie和firefox中对xml的操 ...

最新文章

  1. 博士生宿舍条件太好,本科生因疫情暂住惊到结巴!网友:不然咱读个博?
  2. python使用matplotlib可视化、为可视化图像的X轴和Y轴设置自定义的轴标签(axis labels of matplotlib plot)
  3. windbg检测句柄泄露(定位到具体代码)
  4. 函数的递推matlab,关于递推最小二乘法辨识参数的matlab编程(含注释)
  5. Puzzle 18 - StringCheese - byte storage
  6. 某同学正为自己安装不上sqlserver数据库而愁眉苦脸,使用朋友给的方法顿时喜笑颜开,那么朋友到底出了个什么样的方法呢?...
  7. python画锯齿波_用Python控制硬件35-自制二三十元成本的信号测量采集控制系统
  8. ble l2cap 工作过程_BLE 链路层报文详解
  9. c语言指针交换字符串组,c语言 指针交换两个字符串
  10. c#的const可以用于引用类型吗
  11. 蛮牛精选七款Unity插件
  12. java模板beetl引擎_模板引擎-beetl
  13. python 更换列名
  14. H3C华三交换机初始化配置V7版
  15. 在windows系统调试ydlidar详细记录(物联网机器人方向)
  16. 两种方法模仿支付宝进入到后台界面模糊
  17. 贷记、借记、来帐、往账的区别
  18. mysql 不支持分区_MySQL分区表的局限和限制
  19. 【GameMaker】分离文件路径、文件名、后缀
  20. 普通家庭,千万不要投入大量时间和金钱,让孩子去苦学和培养AI机器人编程了...

热门文章

  1. sudoers配置文件详解
  2. 如何理解delegate (委托)设计模式
  3. PLSQL导出表的数据insert语句
  4. Spring Cloud学习系列第六篇【分布式配置中心】
  5. pm2-zabbix 安装与配置
  6. IntelliTest(5) - The IntelliTest Reference Manual[译]
  7. [转]浅谈OCR之Tesseract
  8. C#中char[]与string之间的转换
  9. 几个书本上不常见到的C语言函数
  10. string find简析