2015-02-12 1 views
0

Я хочу сравнить два файла: один - это 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} 

ответ

0

Я предполагаю, что это происходит потому, что текущий узел хранится внутри где-то и когда вы удалите ее в конечном итоге в родительском узле. Возможно, есть два способа решить эту проблему.

  • Вызов ${xml::NodeHandle}, чтобы сохранить текущий дескриптор узла, вызовите ${xml::NextSibling} и сохранить этот узел, а также. Затем вы можете использовать ${xml::GotoHandle} удалить, а затем перейти к следующему узлу ...

  • Restart цикл с самого начала каждый раз, когда вы удаляете узел ...

+0

Я также думаю, чтобы перезапустить цикл с начала. Не могли бы вы взглянуть на мое решение? Есть ли более простое решение, чем мое? – currarpickt

+0

@currarpickt Вам, вероятно, не нужно LoadFile, SaveFile и Unload внутри цикла, в противном случае это выглядит хорошо ... – Anders

Смежные вопросы