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

如何使用Groovy提取XML中指定标签的具体值?

如何用Groovy提取XML中的指定字段值

我需要从以下XML中提取指定值:

<Message name="InvestorAcctStatement">
     <Field name="ExtRef">180120120000331</Field>
     <Field name="SeqNum">000001</Field>
     <Field name="AC">0000000800100007182</Field>
     <Field name="CurCod">IDR </Field>
     <Field name="ValDate">20090703</Field>
     <Field name="OpenBal">87928063.0000</Field>
     <List name="StatLine">
        <Record name="StatLine">
                    <Field name="ExtRef">180120120000331</Field>
                     <Field name="TrxType">N9293</Field>
                     <Field name="DC">C</Field>
                    <Field name="CashVal">10000.0000</Field>
                    <Field name="Description1">0800100007182</Field>
                    <Field name="Description2">959508221001000</Field>
                    <Field name="Description3">324242</Field>
        </Record>
    </List>
    <Field name="CloseBal">87938063.0000</Field>
     <Field name="Notes">DR  0640100002095 KE 0800100007182      </Field>
</Message>

我尝试了以下Groovy代码:

String dbresponse = '''
<Message name="InvestorAcctStatement">
     <Field name="ExtRef">180120120000331</Field>
     <Field name="SeqNum">000001</Field>
     <Field name="AC">0000000800100007182</Field>
     <Field name="CurCod">IDR </Field>
     <Field name="ValDate">20090703</Field>
     <Field name="OpenBal">87928063.0000</Field>
     <List name="StatLine">
        <Record name="StatLine">
                    <Field name="ExtRef">180120120000331</Field>
                     <Field name="TrxType">N9293</Field>
                     <Field name="DC">C</Field>
                    <Field name="CashVal">10000.0000</Field>
                    <Field name="Description1">DR  0640100002095 KE 0800100007182      </Field>
                    <Field name="Description2">959508221001000                         </Field>
                    <Field name="Description3">                                        </Field>
        </Record>
    </List>
    <Field name="CloseBal">87938063.0000</Field>
     <Field name="Notes">DR  0640100002095 KE 0800100007182      </Field>
</Message>

'''
xml = new XmlParser().parseText(dbresponse)

xml.each { 
    if(it.@name == 'ExtRef') {
        println it
    }
}

运行后返回:Field[attributes={name=ExtRef}; value=[180120120000331]],我不知道如何获取具体的文本值,尤其是嵌套在StatLine下的CashVal字段的值。


解决方法

1. 获取顶层Field的具体文本值

你当前打印的是Field节点对象,要获取节点内的文本值,只需调用text()方法。修改代码如下:

xml.each { node -> 
    if(node.@name == 'ExtRef') {
        println node.text() // 输出:180120120000331
    }
}

2. 获取嵌套在StatLine下的CashVal值

要定位嵌套字段,有两种简洁的实现方式:

// 方法1:逐层遍历节点
xml.List.each { listNode ->
    if(listNode.@name == 'StatLine') {
        listNode.Record.each { recordNode ->
            recordNode.Field.each { fieldNode ->
                if(fieldNode.@name == 'CashVal') {
                    println fieldNode.text() // 输出:10000.0000
                }
            }
        }
    }
}

// 方法2:用GPath直接定位(更高效)
def cashVal = xml.List.find { it.@name == 'StatLine' }?.Record?.Field?.find { it.@name == 'CashVal' }?.text()
println cashVal // 输出:10000.0000

3. 批量提取多个字段的示例

如果需要一次性提取多个字段,可以把结果存入Map统一管理:

def result = [:]
// 提取顶层所有Field字段
xml.Field.each { field ->
    result[field.@name] = field.text().trim()
}
// 提取StatLine下的所有字段
def statLineRecord = xml.List.find { it.@name == 'StatLine' }?.Record
if(statLineRecord) {
    statLineRecord.Field.each { field ->
        result["StatLine.${field.@name}"] = field.text().trim()
    }
}

// 打印所有提取的键值对
result.each { key, value ->
    println "${key}: ${value}"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:55:59