使用 NSIS 删除 XML 文件中的多个节点

Delete several nodes in XML File using NSIS

我想比较两个文件:一个是 xml 文件,另一个是文本文件。如果有一个字符串出现在 xml 文件中,但没有出现在文本文件中,它将从 xml 文件中删除。

我尝试使用 xml.nsh 并使用 FileSearch 来比较它们。删除一个节点后,循环总是停止,因为它找不到 nextsibling。知道如何继续循环吗?

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

      ${IF} [=11=] == 0
           ${xml::RemoveNode} 
      ${ENDIF}

      ${xml::NextSibling} "selection"  [=11=]
${EndWhile}      
${xml::SaveFile} "$TEMP$IISXMLFile" [=11=]    
${xml::NodeHandle} [=11=]
${xml::Unload}

我用这段代码解决了它:

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

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

我猜这是因为当前节点存储在内部某处,当您删除它时,您最终会进入父节点。可能有两种方法可以解决这个问题。

  • 调用${xml::NodeHandle}保存当前节点句柄,调用${xml::NextSibling}保存该节点。然后就可以用${xml::GotoHandle}删除然后去下一个节点...

  • 每次删除节点后从头开始循环...