2015-02-12 65 views
0

我想比較兩個文件:一個是xml文件,另一個是文本文件。如果有一個字符串出現在xml文件中,但沒有出現在文本文件中,它將從xml文件中刪除。使用NSIS刪除XML文件中的多個節點

我試過使用xml.nsh並且還使用FileSearch來比較它們。刪除一個節點後,循環總是停止,因爲它找不到下一個節點。任何想法如何繼續循環?

${xml::LoadFile} "$TEMP\$IISXMLFile" $0 
${xml::GotoPath} "/unattend/servicing/package" $0 
${xml::FirstChild} "assemblyIdentity" $1 $0 
${xml::NextSibling} "selection" $7 $0 
${While} $0 == 0 
     ${xml::GetAttribute} "name" $3 $4 
     Push $TEMP\featurelist.txt 
     Push $3 
     Call FileSearch 
     Pop $0 #Number of times found throughout 
     Pop $1 #Number of lines found on 

     ${IF} $0 == 0 
      ${xml::RemoveNode} $7 
     ${ENDIF} 

     ${xml::NextSibling} "selection" $7 $0 
${EndWhile}  
${xml::SaveFile} "$TEMP\$IISXMLFile" $0  
${xml::NodeHandle} $0 
${xml::Unload} 

我解決它使用此代碼:

${xml::LoadFile} "$TEMP\$IISXMLFile" $0  
loopXML: 
    ${xml::GotoPath} "/unattend/servicing/package" $0 
    ${xml::FirstChild} "assemblyIdentity" $1 $0 
    ${xml::NextSibling} "selection" $7 $0 
    ${While} $0 == 0 
     ${xml::GetAttribute} "name" $3 $4 
     Push $TEMP\featurelist.txt 
     Push $3 
     Call FileSearch 
     Pop $0 #Number of times found throughout 
     Pop $1 #Number of lines found on 

     ${IF} $0 == 0 
      ${xml::RemoveNode} $7  
      ${xml::NodeHandle} $0 
      goto loopXML 
     ${ENDIF} 
     ${xml::NextSibling} "selection" $7 $0 
    ${EndWhile}  
${xml::SaveFile} "$TEMP\$IISXMLFile" $0  
${xml::NodeHandle} $0 
${xml::Unload} 

回答

0

我猜這是因爲,當前節點正在內部存儲的地方,當你刪除它,你的父節點結束。可能有兩種方法可以解決這個問題。

  • 呼叫${xml::NodeHandle}保存當前節點處理,呼叫${xml::NextSibling}並保存該節點爲好。然後,您可以使用${xml::GotoHandle}刪除,然後進入下一個節點......

  • 從頭開始每次你刪除一個節點時,循環...

+0

我也想重新開始循環從一開始就。你能看看我的解決方案嗎?有比我更簡單的解決方案嗎? – currarpickt 2015-02-13 07:14:10

+0

@currarpickt你可能不需要LoadFile,SaveFile和Unload在循環中,否則它看起來不錯... – Anders 2015-02-14 00:57:53