我想比较两个文件:一个是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}
答案 0 :(得分:0)
我猜这是因为当前节点存储在内部某个地方,当你删除它时,你最终会进入父节点。可能有两种方法可以解决这个问题。
调用${xml::NodeHandle}
保存当前节点句柄,调用${xml::NextSibling}
并保存该节点。然后,您可以使用${xml::GotoHandle}
删除,然后转到下一个节点...
每次删除节点时都从头开始重新启动循环...