如何使用Groovy XML API创建含分隔文本值的XML元素
Groovy 创建混合内容XML节点方法
直接用Groovy内置的groovy.xml.MarkupBuilder即可原生支持文本、子标签穿插的混合内容节点,不需要额外依赖,写法非常直观,只需要按照内容在XML里出现的顺序,依次写入文本节点和子标签即可,构建器会自动按顺序拼接内容,不会打乱结构。
示例1:生成基础混合内容节点
如果要生成文本被<b>标签分隔的核心p节点,也就是示例code标签里包裹的原始XML结构,代码如下:
import groovy.xml.MarkupBuilder def stringWriter = new StringWriter() def xmlBuilder = new MarkupBuilder(stringWriter) xmlBuilder.p { // 输出子标签前的第一段文本 mkp.yield 'This is really ' // 输出嵌套的b子标签 b 'important' // 输出子标签后的第二段文本 mkp.yield ', ok?!' } println stringWriter.toString()
运行后输出结果:
<p>This is really <b>important</b>, ok?!</p>
示例2:生成给出的完整目标XML
如果要生成外层p包裹code标签、code标签内是转义后XML源码的结构,直接把要转义的字符串作为code标签的内容传入即可,MarkupBuilder会自动转义尖括号等特殊字符:
import groovy.xml.MarkupBuilder def stringWriter = new StringWriter() def xmlBuilder = new MarkupBuilder(stringWriter) xmlBuilder.p { code('<p>This is really <b>important</b>, ok?!</p>') } println stringWriter.toString()
运行后输出的结果和目标XML完全一致:
<p><code><p>This is really <b>important</b>, ok?!</p></code></p>
注意事项
- 不要把包含嵌套标签的整段内容作为普通字符串传入标签,否则所有尖括号都会被转义成普通文本,无法生成预期的嵌套子节点
mkp.yield是MarkupBuilder提供的专门输出纯文本节点的方法,混合内容场景下在子标签前后调用它传入对应文本即可,文本内的特殊字符会被自动合规转义- 除非明确需要输出原始XML片段,否则不要用
mkp.yieldUnescaped方法,随意使用很容易生成不符合XML语法规范的非法结构
内容的提问来源于stack exchange,提问作者Dr. Jedi
相关产品推荐
相关产品推荐

