如何使用XmlParser/XmlSlurper获取XML节点不含子元素的根文本值
问题原因
Groovy 中 XmlSlurper 和 XmlParser 的默认 text() 方法会递归返回当前节点及所有下级子节点的文本内容,所以会把字段当前值和嵌套的<previous>节点的历史值拼接返回,不符合取值需求。
解决方案
1. 使用 XmlSlurper 场景
直接调用节点的 localText() 方法即可只获取当前节点自身的直接文本内容,不会包含子节点文本:
xml.each { it -> def PersonId = it.id.text().trim() // localText()返回当前节点直接文本的列表,join拼接后去除首尾空白 def Status = it.person.status.localText().join().trim() def PrevStatus = it.person.status.previous.text().trim() if (Status && PrevStatus) { // 状态已变更,执行对应逻辑 } }
2. 使用 XmlParser 场景
手动筛选节点的直接文本内容,过滤掉<previous>这类元素子节点即可:
xml.each { it -> def PersonId = it.id.text().trim() // 只保留文本类型的子内容,排除元素节点 def Status = it.person.status.children() .findAll { it instanceof String } .join() .trim() def PrevStatus = it.person.status.previous.text().trim() if (Status && PrevStatus) { // 状态已变更,执行对应逻辑 } }
以上方案对所有带<previous>嵌套子节点的字段通用,比如示例中的code字段,只需把取值路径里的status替换为code即可直接复用。
内容的提问来源于stack exchange,提问作者NDBoost
相关产品推荐
相关产品推荐

