一、标签闭包下创建子标签
在上一篇博客 【Groovy】xml 序列化 ( 使用 MarkupBuilder 生成 xml 数据 ) 生成的 xml 文件基础上 , 如果要在标签下 , 创建子标签 , 如下的 标签下再创建 标签 ;
<student> <name code="utf-8">Tom</name> <age>18</age> <team> <member>Jerry</member> </team> </student>
在创建标签的闭包中 , 再次嵌套创建标签即可 ;
markupBuilder.student{ // 标签下创建子标签 team() { member("Jerry") {} } }
完整代码如下 :
// 生成上述 xml 文件 markupBuilder.student{ // 格式如下 : // xml 标签名称( 标签内容 , 标签属性 : 标签属性值) // 生成标签内容 : 标签内容直接写上即可 // 生成标签属性 : 标签属性使用键值对方式生成 name("Tom", code: "utf-8") { } age(18) {} // 标签下创建子标签 team() { member("Jerry") {} } }
二、使用 MarkupBuilderHelper 添加 xml 注释
在闭包中可以通过 mkp 获取 MarkupBuilderHelper 对象 , 该对象可以帮助添加 xml 注释 ;
/** * 属性,该属性可以从生成器闭包中调用以访问帮助器方法, * 即 {@link MarkupBuilderHelper#yield(String)}, * {@link MarkupBuilderHelper#yieldUnescaped(String)}, * {@link MarkupBuilderHelper#pi(Map)}, * {@link MarkupBuilderHelper#xmlDeclaration(Map)} and * {@link MarkupBuilderHelper#comment(String)}. * * @return this MarkupBuilder */ public MarkupBuilderHelper getMkp() { return new MarkupBuilderHelper(this); }
MarkupBuilderHelper 类中提供了一些方法 , 其中 comment 方法 , 可以用于添加注释 ;
public class MarkupBuilderHelper { private final MarkupBuilder builder; /** * 在输出中生成注释。 * <p> * <code>mkp.comment 'string'</code> is equivalent to * <code>mkp.yieldUnescaped '<!-- string -->'</code>. * To create an element with the name 'comment', you need * to supply empty attributes, e.g.: * <pre> * comment('hello1') * </pre> * or * <pre> * mkp.comment('hello1') * </pre> * will produce: * <pre> * <!-- hello1 --> * </pre> * while: * <pre> * comment('hello2', [:]) * </pre> * will produce: * <pre> * <comment>hello2</comment> * </pre> * * @param value the text within the comment. */ public void comment(String value) { yieldUnescaped("<!-- " + value + " -->"); } }
在闭包中使用 mkp.comment("学生姓名") 代码 , 可以生成 注释 ;
markupBuilder.student{ mkp.comment("学生姓名") }
三、完整代码示例
完整代码示例 :
import groovy.xml.MarkupBuilder """ <student> <name code="utf-8">Tom</name> <age>18</age> <team> <member>Jerry</member> </team> </student> """ def fileWriter = new FileWriter(new File("a.xml")) // 创建 MarkupBuilder 对象 // 构造函数中传入 FileWriter 表示将 xml 文件写出到文件中 def markupBuilder = new MarkupBuilder(fileWriter) // 生成上述 xml 文件 markupBuilder.student{ // 格式如下 : // xml 标签名称( 标签内容 , 标签属性 : 标签属性值) // 生成标签内容 : 标签内容直接写上即可 // 生成标签属性 : 标签属性使用键值对方式生成 name("Tom", code: "utf-8") { } mkp.comment("学生姓名") age(18) {} mkp.comment("学生年龄") // 标签下创建子标签 team() { member("Jerry") {} } mkp.comment("小组成员") }
执行结果 :
<student> <name code='utf-8'>Tom</name><!-- 学生姓名 --> <age>18</age><!-- 学生年龄 --> <team> <member>Jerry</member> </team><!-- 小组成员 --> </student>