日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/6/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 信息 | 完整代码示例 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。