2015-02-12 84 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