需要使用Groovy更新标记值

需要使用Groovy更新标记值,groovy,Groovy,我需要更新类别为测试的TRDCHARGE_AMOUNT的标签值。我已经能够更新其他直接标记的值 <?xml version="1.0" encoding="UTF-8"?> <TRANSACTIONS ASOF_DATE="4/2/2014" CREATE_DATE="4/2/2014" RECORDS="1"> <TRADE> <CUSIP>31384WPS3</CUSIP> <DESC_

我需要更新类别为测试的TRDCHARGE_AMOUNT的标签值。我已经能够更新其他直接标记的值

<?xml version="1.0" encoding="UTF-8"?>
<TRANSACTIONS ASOF_DATE="4/2/2014" CREATE_DATE="4/2/2014" RECORDS="1">
    <TRADE>
        <CUSIP>31384WPS3</CUSIP>
        <DESC_INSTMT>CREDIT INDUSTRIEL ET COMMERCIAL (N</DESC_INSTMT>
        <DESK>a</DESK>
        <DESK_TYPE>GEN</DESK_TYPE>
        <DTM_2A7>7</DTM_2A7>
        <EXECUTION_TIME>4/1/2014 10:03:06.000</EXECUTION_TIME>
        <EXEC_TIME_SOURCE>A</EXEC_TIME_SOURCE>
        <FUND>VIMVP-FI</FUND>
        <INT_AT_MATURITY>536.6666666667</INT_AT_MATURITY>
        <INVNUM>-911223</INVNUM>
        <TRDCHARGE_set SIZE="2">
      - <TRDCHARGE>
          <CALC_TYPE>FLAT</CALC_TYPE> 
          <CATEGORY>TEST</CATEGORY> 
          <RATE>0.0000000000</RATE> 
          <TRDCHARGE_AMOUNT>1000.0000000000</TRDCHARGE_AMOUNT> 
          <TRDCHARGE_SCHEDULE_ID>-111111.0000000000</TRDCHARGE_SCHEDULE_ID> 
      </TRDCHARGE>
      - <TRDCHARGE>
          <CALC_TYPE>FLAT</CALC_TYPE> 
          <CATEGORY>LOCL</CATEGORY> 
          <RATE>0.0000000000</RATE> 
          <TRDCHARGE_AMOUNT>50.0000000000</TRDCHARGE_AMOUNT> 
          <TRDCHARGE_SCHEDULE_ID>-112221.0000000000</TRDCHARGE_SCHEDULE_ID> 
      </TRDCHARGE>
    </TRDCHARGE_set>
    </TRADE>

您可以这样做:

import groovy.xml.XmlUtil

def example = '''
<TRANSACTIONS ASOF_DATE="4/2/2014" CREATE_DATE="4/2/2014" RECORDS="1">
  <TRADE>
    <CUSIP>31384WPS3</CUSIP>
    <DESC_INSTMT>CREDIT INDUSTRIEL ET COMMERCIAL (N</DESC_INSTMT>
    <DESK>a</DESK>
    <DESK_TYPE>GEN</DESK_TYPE>
    <DTM_2A7>7</DTM_2A7>
    <EXECUTION_TIME>4/1/2014 10:03:06.000</EXECUTION_TIME>
    <EXEC_TIME_SOURCE>A</EXEC_TIME_SOURCE>
    <FUND>VIMVP-FI</FUND>
    <INT_AT_MATURITY>536.6666666667</INT_AT_MATURITY>
    <INVNUM>-911223</INVNUM>
  <TRDCHARGE_set SIZE="2">
  <TRDCHARGE>
      <CALC_TYPE>FLAT</CALC_TYPE>
      <CATEGORY>TEST</CATEGORY>
      <RATE>0.0000000000</RATE>
      <TRDCHARGE_AMOUNT>1000.0000000000</TRDCHARGE_AMOUNT>
      <TRDCHARGE_SCHEDULE_ID>-111111.0000000000</TRDCHARGE_SCHEDULE_ID>
  </TRDCHARGE>
  <TRDCHARGE>
      <CALC_TYPE>FLAT</CALC_TYPE>
      <CATEGORY>LOCL</CATEGORY>
      <RATE>0.0000000000</RATE>
      <TRDCHARGE_AMOUNT>50.0000000000</TRDCHARGE_AMOUNT>
      <TRDCHARGE_SCHEDULE_ID>-112221.0000000000</TRDCHARGE_SCHEDULE_ID>
  </TRDCHARGE>
 </TRDCHARGE_set>
 </TRADE>
</TRANSACTIONS>
'''

new XmlParser().parseText(example).with { x ->
  x.TRADE.each { trade ->
    trade.children().find { it -> it.name() == 'FUND' }?.value = 'CASH'
    trade.children().find { it -> it.name() == 'INVNUM' }?.value = '-675'
    trade.children().find { it -> it.name() == 'CUSIP' }?.value = '3B56GTUNN'
    trade.TRDCHARGE_set.TRDCHARGE.each {
        it.children().find { it.name() == 'TRDCHARGE_AMOUNT'}?.value = 5.0
    }
  }
  println XmlUtil.serialize(x)
}

这会将所有TRDCHARGE_AMOUNT值更改为5.0并打印结果。

现在问题出在哪里?我的代码不起作用了吗?或者它工作不好?我已经编辑了这个示例并提供了完整的代码。您可以将其作为groovy脚本执行。
import groovy.xml.XmlUtil

def example = '''
<TRANSACTIONS ASOF_DATE="4/2/2014" CREATE_DATE="4/2/2014" RECORDS="1">
  <TRADE>
    <CUSIP>31384WPS3</CUSIP>
    <DESC_INSTMT>CREDIT INDUSTRIEL ET COMMERCIAL (N</DESC_INSTMT>
    <DESK>a</DESK>
    <DESK_TYPE>GEN</DESK_TYPE>
    <DTM_2A7>7</DTM_2A7>
    <EXECUTION_TIME>4/1/2014 10:03:06.000</EXECUTION_TIME>
    <EXEC_TIME_SOURCE>A</EXEC_TIME_SOURCE>
    <FUND>VIMVP-FI</FUND>
    <INT_AT_MATURITY>536.6666666667</INT_AT_MATURITY>
    <INVNUM>-911223</INVNUM>
  <TRDCHARGE_set SIZE="2">
  <TRDCHARGE>
      <CALC_TYPE>FLAT</CALC_TYPE>
      <CATEGORY>TEST</CATEGORY>
      <RATE>0.0000000000</RATE>
      <TRDCHARGE_AMOUNT>1000.0000000000</TRDCHARGE_AMOUNT>
      <TRDCHARGE_SCHEDULE_ID>-111111.0000000000</TRDCHARGE_SCHEDULE_ID>
  </TRDCHARGE>
  <TRDCHARGE>
      <CALC_TYPE>FLAT</CALC_TYPE>
      <CATEGORY>LOCL</CATEGORY>
      <RATE>0.0000000000</RATE>
      <TRDCHARGE_AMOUNT>50.0000000000</TRDCHARGE_AMOUNT>
      <TRDCHARGE_SCHEDULE_ID>-112221.0000000000</TRDCHARGE_SCHEDULE_ID>
  </TRDCHARGE>
 </TRDCHARGE_set>
 </TRADE>
</TRANSACTIONS>
'''

new XmlParser().parseText(example).with { x ->
  x.TRADE.each { trade ->
    trade.children().find { it -> it.name() == 'FUND' }?.value = 'CASH'
    trade.children().find { it -> it.name() == 'INVNUM' }?.value = '-675'
    trade.children().find { it -> it.name() == 'CUSIP' }?.value = '3B56GTUNN'
    trade.TRDCHARGE_set.TRDCHARGE.each {
        it.children().find { it.name() == 'TRDCHARGE_AMOUNT'}?.value = 5.0
    }
  }
  println XmlUtil.serialize(x)
}