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
相关产品推荐
相关产品推荐

