如何使用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
相关产品推荐
相关产品推荐

