使用 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}
删除然后去下一个节点...
每次删除节点后从头开始循环...
我想比较两个文件:一个是 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}
删除然后去下一个节点...每次删除节点后从头开始循环...