文章目录
- 一、构造 Xml 节点类
- 1、封装节点名称、节点值、节点属性、子节点
- 2、将封装的节点数据转为 Xml 字符串
- 二、Xml 节点类完整代码
一、构造 Xml 节点类
生成 Xml 数据前 , 首先要将 Xml 数据封装起来 , 先手机 Xml 的各个层级节点的信息 , 最后利用这些节点信息生成 Xml 数据 ;
参考下面的 xml 文件构造节点类 ;
代码语言:javascript复制<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 数据方法 ;
代码语言:javascript复制<student>
<name code="utf-8">Tom</name>
<age>18</age>
</student>
节点有
种情况 , 带属性的节点和不带属性的节点 ,
- ① 带属性的节点
<name code="utf-8">Tom</name>
- ② 不带属性的节点
<age/>
使用给定的 Writer writer 输出 Xml 信息 ;
以 <name code="utf-8">Tom</name>
为例 , 先输出 <name
信息 ,
writer.write("<${name}")
假如该节点有节点属性信息 , 循环写出节点属性 ;
代码语言:javascript复制 /*
假如该节点有节点属性信息
循环写出节点属性
*/
if (attributes != null) {
attributes.each {
writer.write(" ${it.key}='${it.value}'")
}
}
节点值以及子节点输出可能有如下
种情况 :
- 节点有值, 没有子节点
- 节点没有值, 没有子节点
- 节点有值, 有子节点
- 节点没有值, 有子节点
- 既没有值有没有子节点
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("/>")
}
}
}