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

时间:2015-02-12 08:45:33

标签: xml nsis

我想比较两个文件:一个是xml文件,另一个是文本文件。如果xml文件中出现但未出现在文本文件中的字符串,则会从xml文件中删除该字符串。

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

${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}

1 个答案:

答案 0 :(得分:0)

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

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

  • 每次删除节点时都从头开始重新启动循环...