【Groovy】自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )
文章目錄
- 一、創建 XmlNode 節點
- 二、管理 XmlNode 節點并將根節點轉為 Xml 信息
- 三、完整代碼示例
- 1、自定義 Xml 生成器 MyBuilderSupport
- 2、Xml 節點封裝了 XmlNode
- 3、在 Groovy 腳本中生成 Xml 信息
一、創建 XmlNode 節點
在 class MyBuilderSupport extends BuilderSupport 類中維護一個 Map 集合 , 該 Map 集合用于存儲 上一篇博客 【Groovy】自定義 Xml 生成器 BuilderSupport ( 構造 Xml 節點類 | 封裝節點名稱、節點值、節點屬性、子節點 | 將封裝的節點數據轉為 Xml 字符串 ) 中封裝的 XmlNode 節點 ;
該 Map 集合的 Key 是節點名稱 , Value 是 XmlNode 節點的值 ;
/*** Map 集合* Key 為 節點的 name 名稱* Value 為 節點 XmlNode 對象*/def xmlNodes = [:]createNode 方法 , 是創建節點的方法 , 此處可以創建 XmlNode 節點 , 并放入 Map 集合中 ;
@Overrideprotected Object createNode(Object name, Map attributes, Object value) {println "創建節點 名稱 : $name, 屬性 : $attributes, 值 : $value"xmlNodes.put(name, new XmlNode(name, value, attributes))return name;}二、管理 XmlNode 節點并將根節點轉為 Xml 信息
BuilderSupport#nodeCompleted 方法是節點關閉的回調方法 ;
方法原型如下 :
@Overrideprotected void nodeCompleted(Object parent, Object node) {super.nodeCompleted(parent, node)}其中 Object node 是被關閉的節點 , Object parent 是被關閉節點的父節點 ;
節點關閉時 , 可以根據 Object node 參數獲取該被關閉的節點
def currentXmlNode = xmlNodes[node]如果該被關閉的節點有父節點 , 即 Object parent 參數不為空 , 則將該節點放入父節點 XmlNode 的 children 子節點集合中 ;
if (parent) {// 該節點有父節點, 將該節點放入父節點的 children 集合中xmlNodes[parent].children << currentXmlNode}如果該被關閉的節點沒有父節點 , 說明該節點就是根節點 , 根節點關閉 意味著 Xml 數據生成完畢 , 此時可以將該根節點輸出 ;
// 如果該節點沒有父節點, 說明該節點就是根節點, 則開始構建 Xml 文件currentXmlNode.build(writer)三、完整代碼示例
1、自定義 Xml 生成器 MyBuilderSupport
import groovy.util.BuilderSupport;import java.util.Map;public class MyBuilderSupport extends BuilderSupport {/*** Map 集合* Key 為 節點的 name 名稱* Value 為 節點 XmlNode 對象*/def xmlNodes = [:]/*** 寫用于出 Xml 數據*/Writer writerMyBuilderSupport(Writer writer) {this.writer = writer}/*** 設置節點之間的關系* @param parent Xml 中的父節點* @param child Xml 中的父節點下的子節點*/@Overrideprotected void setParent(Object parent, Object child) {println "setParent 設置子節點 ${child} 的父節點是 ${parent}"}@Overrideprotected Object createNode(Object name) {/*所有的 createNode 方法都回調到 3 個參數的 createNode 方法*/return createNode(name, null, null);}@Overrideprotected Object createNode(Object name, Object value) {/*所有的 createNode 方法都回調到 3 個參數的 createNode 方法*/return createNode(name, null, value);}@Overrideprotected Object createNode(Object name, Map attributes) {/*所有的 createNode 方法都回調到 3 個參數的 createNode 方法*/return createNode(name, attributes, null);}@Overrideprotected Object createNode(Object name, Map attributes, Object value) {println "創建節點 名稱 : $name, 屬性 : $attributes, 值 : $value"xmlNodes.put(name, new XmlNode(name, value, attributes))return name;}/*** 閉合節點時, 回調該方法* @param parent* @param node*/@Overrideprotected void nodeCompleted(Object parent, Object node) {super.nodeCompleted(parent, node)println "nodeCompleted 完成了父節點為 parent : $parent 的節點 node : $node 的閉合操作"def currentXmlNode = xmlNodes[node]if (parent) {// 該節點有父節點, 將該節點放入父節點的 children 集合中xmlNodes[parent].children << currentXmlNode} else {// 如果該節點沒有父節點, 說明該節點就是根節點, 則開始構建 Xml 文件currentXmlNode.build(writer)}} }
2、Xml 節點封裝了 XmlNode
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("/>")}} }
3、在 Groovy 腳本中生成 Xml 信息
// 用于輸出字符串 StringWriter stringWriter = new StringWriter()// 創建自定義 Xml 構造器 def myBuilderSupport = new MyBuilderSupport(stringWriter)// 構建 student 根節點 myBuilderSupport.student {// 構建 student 根節點下的 name 節點// 該節點有 code: "UTF-8" 屬性// 節點元素為 "Tom" 字符串name("Tom", code: "UTF-8")age("18") }println "" println(stringWriter)
執行結果 :
創建節點 名稱 : 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 的閉合操作<student><name code='UTF-8'>Tom</name><age>18</age></student>其中
<student><name code='UTF-8'>Tom</name><age>18</age></student>就是生成的 Xml 數據 ;
總結
以上是生活随笔為你收集整理的【Groovy】自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Groovy】自定义 Xml 生成器
- 下一篇: 【Android Gradle 插件】s