Groovy使用MarkupBuilder生成含_-前缀根节点XML报错的解决方法
Groovy MarkupBuilder生成特殊开头XML节点的解决方案
问题根源
MarkupBuilder默认通过属性调用创建节点(比如builder.root { ... }),但_-开头的节点名不符合Groovy标识符规则,直接用属性方式调用会被Groovy解析成无效语法,触发MissingPropertyException。
三种可行解决办法
1. 带引号的节点名(最简洁)
把特殊开头的节点名用单/双引号包裹,Groovy会正确识别为节点名称而非属性:
import groovy.json.JsonSlurper import groovy.xml.MarkupBuilder // 输入JSON示例 def inputJson = '''{ "data": { "name": "test", "value": "123" } }''' def jsonData = new JsonSlurper().parseText(inputJson) def writer = new StringWriter() def builder = new MarkupBuilder(writer) // 核心:用引号包裹特殊节点名 builder.'_-root' { data { name(jsonData.data.name) value(jsonData.data.value) } } println writer.toString()
2. 动态调用invokeMethod
如果节点名是动态生成的,用invokeMethod传入节点名字符串和闭包:
// 承接上面的代码,替换节点创建部分 builder.invokeMethod('_-root', { data { name(jsonData.data.name) value(jsonData.data.value) } })
3. 使用node方法(Groovy 2.5+)
Groovy 2.5及以上版本提供了node方法,直接传入节点名和闭包:
// 承接上面的代码,替换节点创建部分 builder.node('_-root') { data { name(jsonData.data.name) value(jsonData.data.value) } }
期望输出结果
三种方法都会生成符合要求的XML:
<_-root> <data> <name>test</name> <value>123</value> </data> </_-root>
注意事项
- 只要节点名包含特殊字符(比如
_-开头、空格、非ASCII符号),都不能直接用builder.节点名的写法,必须用字符串形式传递节点名。 - 带引号的写法是最直观的,推荐优先使用。
内容的提问来源于stack exchange,提问作者Yalamati hemanth kumar
相关产品推荐
相关产品推荐

