xmlpoke in Nant - come aggiornare tutte le istanze della stringa trovata
Domanda
Ciao Sto usando Xpath nel mio script di build Nant modificare alcune variabili di configurazione tra sviluppo ed i miei altri ambienti.
ho preso la sintassi da questo esempio:
I esempio si presenta:
<xmlpoke
file="config01/app.config"
xpath="/configuration/appSettings/add[@key='AppName']/@value"
value="TradeMonster">
</xmlpoke>
Quello che vorrei è qualcosa di simile a questo per cercare le mie stringhe di connessione e trovare tutte le istanze di "localhost \ SqlExpress" e semplicemente cambiare a poco "localhost"
È possibile?
Soluzione
giocare con uno script sporca Quick'n qui ....
Se sei sicuro c'è un solo elemento ConnectionString in ogni file è possibile eseguire questa con una combinazione di xmlpeek
e xmlpoke
. Modificando la stringa viene più facile fatto con un po 'di C #, quindi, utilizzando un compito script per fare una ricerca regex e sostituzione:
<script language="C#" prefix="custom" >
<code>
<![CDATA[
[Function("fix")]
public static string Fix(string input) {
return Regex.Replace(input, @"localhost\\\w+", "localhost");
}
]]>
</code>
</script>
<!-- Get the existing connection string -->
<xmlpeek
file="config01/app.config"
xpath="/configuration/connectionStrings/add[@contains(@connectionString,'localhost\')]/@connectionString"
property="connectionstring">
</xmlpeek>
<!-- Write back the modified connection string -->
<xmlpoke
file="config01/app.config"
xpath="/configuration/connectionStrings/add[@contains(@connectionString,'localhost\')]/@connectionString"
value="${custom::fix(connectionstring)}">
</xmlpoke>
Altri suggerimenti
XPath seleziona solo i nodi, non può cambiare i nodi .
Un modo per realizzare i cambiamenti necessari è quello di eseguire una trasformazione XSLT sul documento XML.
Al fine di rendere questo accada, è necessario fornire il documento XML e di specificare esattamente quale dei suoi nodi di testo devono essere cambiate.