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

Jenkins Groovy Pipeline中XmlParser调用element1报错的原因与解决

Jenkins Pipeline中XmlParser调用element1.text()报错MissingPropertyException

问题场景

解析以下XML内容:

<root><element1 attribute1="value1">Text content of element1</element1></root>

使用Groovy的XmlParser编写代码如下,本地运行正常,但在Jenkins Pipeline中执行报错:

def parser = new XmlParser()
def xmlContent = '<root><element1 attribute1="value1">Text content of element1</element1></root>'
def output = parser.parseText(xmlContent)
script.echo(output.element1.text())

本地环境:Groovy 2.4.21、Java 11,输出预期结果Text content of element1;Jenkins环境:Groovy 2.4.21、Java 11、Jenkins 2.375.1,报错信息:

groovy.lang.MissingPropertyException: No such field found: field groovy.util.Node element1

异常原因

Jenkins Pipeline基于CPS(Continuations Passing Style)转换机制运行,该机制会修改Groovy的元编程行为。本地Groovy中output.element1是通过Node类的动态属性访问(底层调用getAt方法)获取子节点,但在Pipeline的CPS环境下,这种动态属性访问会被直接解析为访问Node类的静态字段element1,而该字段不存在,因此抛出MissingPropertyException。

解决方法

方法1:使用下标访问或get()方法替代动态属性

将动态属性访问改为Node类支持的下标访问或get()方法,这两种方式在CPS环境下可以正常触发节点查找逻辑:

def parser = new XmlParser()
def xmlContent = '<root><element1 attribute1="value1">Text content of element1</element1></root>'
def output = parser.parseText(xmlContent)
// 方式1:下标访问
script.echo(output['element1'].text())
// 方式2:get()方法
script.echo(output.get('element1').text())

方法2:替换为XmlSlurper

XmlSlurper的GPath表达式在Jenkins Pipeline中的兼容性更好,无需修改访问方式即可正常运行:

def slurper = new XmlSlurper()
def xmlContent = '<root><element1 attribute1="value1">Text content of element1</element1></root>'
def output = slurper.parseText(xmlContent)
script.echo(output.element1.text())

内容的提问来源于stack exchange,提问作者Jaci_2019

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:01:04