Jenkinsfile中XmlParser读XML报MalformedURLException如何修复
问题根源
你对XmlParser的方法使用有误:XmlParser的parse()方法接收字符串入参时,会默认将该字符串识别为资源URL/URI去尝试加载资源,不会直接把字符串当做XML文本解析。
你通过Jenkins内置readFile步骤拿到的myfile变量是XML文件的完整文本内容,直接传入parse()后,方法会把<?xml version="1.0" encoding="UTF-8"?>这段开头当做URL解析,自然抛出无对应协议的MalformedURLException报错。
正确读取XML的实现
两种适配Jenkins流水线的写法均可:
- 方式1:继续使用
readFile读取文本,调用parseText()方法解析XML内容
// 读取工作区下的XML文件文本 def xmlContent = readFile(file: "your/file/path.xml") // 用parseText解析文本格式的XML内容,不要用parse def xmlNode = new XmlParser().parseText(xmlContent)
- 方式2:直接传入File对象给
parse()方法,无需提前调用readFile
// 注意路径为Jenkins当前job工作区的相对路径,也可填写服务器绝对路径 def xmlNode = new XmlParser().parse(new File("your/file/path.xml"))
注意:Jenkins流水线默认以当前任务的工作区为根目录执行代码,写相对路径时请确认文件已存在于工作区对应位置,避免出现文件找不到的问题。
修改XML节点并写入新文件
解析完成后可直接操作节点对象修改值/属性,再通过XmlNodePrinter输出到新文件,该方式是Groovy原生实现,在Jenkins环境中兼容性最好,无需额外依赖:
// 以直接解析文件为例 def sourceXml = new XmlParser().parse(new File("source.xml")) // 修改节点文本值:示例修改根节点node1下的element1节点内容 sourceXml.element1[0].text = "your new value here" // 如果需要修改节点属性,使用@符号访问属性即可,示例: // sourceXml.element2[0].@id = "new_attr_value" // 写入到新的XML文件 def targetFile = new File("modified_result.xml") targetFile.withWriter("UTF-8") { fileWriter -> def nodePrinter = new XmlNodePrinter(new PrintWriter(fileWriter)) // 配置保留原XML的空白格式,避免输出内容全部挤在一行 nodePrinter.preserveWhitespace = true nodePrinter.print(sourceXml) }
内容的提问来源于stack exchange,提问作者Carabes
相关产品推荐
相关产品推荐

