You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 23:20:40