2011-11-02 53 views
0

我有下面的XML,更新添加了 「症狀」創建使用Groovy XML大廈

<EBF> 
<EBFINFO> 
    <EBFNUM>EBF262323</EBFNUM> 
    <RELEASEDATETIME>May 06, 2011</RELEASEDATETIME> 
    <SYMPTOMS> 
    <br> INFA252994 - 910 : While running concurrent session Workflow manager hangs and workflow monitor does not respond</br> 
    <br> INFA262323 - 910 : pmcmd, pmdtm and all LM clients on Windows fail to connect to IS when IPv6 is installed but all IPv6 interfaces are disabled</br> 
    </SYMPTOMS> 
    <FILES> 
     <FILE> 
     <PATH>H:\EBF262323\EBF262323_Client_Installer_win32_x86\EBFs\clients\PmClient\client\bin\ACE.dll_bak</PATH> 
     <CHECKSUM>303966974</CHECKSUM> 
     <AFFECTEDFILES> 
      <CHECKSUM>3461283269</CHECKSUM> 
      <PATH>C:\clients\PmClient\CommandLineUtilities\PC\server\bin\ACE.dll</PATH> 
      <PATH>C:\clients\PmClient\client\bin\ACE.dll</PATH> 
     </AFFECTEDFILES> 
     </FILE> 
    </FILES> 
    <NOTES> 
    </NOTES> 
</EBFINFO> 
</EBF> 

注意嵌套的節點:在上面的XML EBF \ enfinfo \文件\文件\ affectedfiles \路徑和EBF \ enfinfo \文件\文件可以是我解析,並生成另一個XML出來的

def records = new XmlParser().parseText(rs) 
    csm.ebfHistory(){ 
    records.EBFINFO.each{ 
    ebfHistory_info(num:it.EBFNUM.text(), 
     release_date_time:it.RELEASEDATETIME.text() 
     ){ 

      it.FILES.FILE.each{ //says Exception in thread "main" java.lang.NullPointerException: Cannot get property 'FILES' on null object 
       ebfHistory_fileinfo(file_path:it.PATH.text(), 
        file_checksum:it.CHECKSUM.text() 
       ){ 
        ebfHistory_fileinfo_affectedfiles(
         afile_checksum:it.CHECKSUM.text(), 
         afile_path:it.PATH.text() 
         ) 
       } 
      } 
     } 
    }    
} 

類似下面一個或多個

<ebfHistory> 
    <ebfHistory_info num="EBF262323",release_date_time="May 06, 2011"> 
     <ebfHistory_fileinfo file_checksum="303966974"> 
      <ebfHistory_fileinfo_affectedfiles afile_checksum="3461283269"> 
       <path>C:\clients\PmClient\CommandLineUtilities\PC\server\bin\ACE.dll</path> 
       <path>C:\clients\PmClient\client\bin\ACE.dll</path> 
      </ebfHistory_fileinfo_affectedfiles> 
     </ebfHistory_fileinfo> 
    </ebfHistory_info> 
</ebfHistory> 

但是我得到Exception in thread "main" java.lang.NullPointerException: Cannot get property 'FILES' on null object我在哪裏出錯了?請幫助別人。由於

更新後的代碼(工作)

def records = new XmlParser().parseText(rs) 
     csm.ebfHistory(){ 
      records.EBFINFO.each{ ebfinfo -> 
       ebfHistory_info(num:ebfinfo.EBFNUM.text(), 
        release_date_time:ebfinfo.RELEASEDATETIME.text()) 
        { 
         ebfinfo.SYMPTOMS.br.each{ 
          ebfHistory_symptom(name:it.text()) 
         } 
        } 
      } 
      ebfHistory_dump(rs){ 
       "${rs}" 
      } 
     } 

回答

2

it不再是指每個EBFINFO,因爲你是在另一封 - 的ebfHistory_info關閉。

相反,明確命名EBFINFO對象:

records.EBFINFO.each { ebfinfo -> // <-- Give it a name 
    ebfHistory_info(num:it.EBFNUM.text(), 
        release_date_time:it.RELEASEDATETIME.text()) { 
     ebfinfo.FILES.FILE.each { // <-- Use the name here 

同樣的事情在ebfHistory_fileinfo_affectedfiles參數。

+0

EBFINFO可以是一個或多個,所以仍然可以唯一標識? – abi1964

+2

'it'變量是一個[隱式變量](http://groovy.codehaus.org/Closures#Closures-Implicitvariables),它是單參數閉包的參數。正如我所說的,當你調用'ebfHistory_info'時,你*創建另一個閉包*,因此'it'在新閉包的範圍內被重新綁定。您必須*顯式地命名* EBFINFO實例,而不是使用隱含的'it',因爲一旦進入新的閉包,它不再是EBFINFO。 –

+0

請看看我更新的問題,我試過你的方式,但得到一些錯誤 – abi1964