Я хочу сравнить два файла: один - это xml-файл, а другой - текстовый файл. Если в файле xml есть строка, но не в текстовом файле, она будет удалена из xml-файла.Удаление нескольких узлов в XML-файле с использованием NSIS
Я пробовал использовать 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}
Я также думаю, чтобы перезапустить цикл с начала. Не могли бы вы взглянуть на мое решение? Есть ли более простое решение, чем мое? – currarpickt
@currarpickt Вам, вероятно, не нужно LoadFile, SaveFile и Unload внутри цикла, в противном случае это выглядит хорошо ... – Anders