2010-05-05 21 views
5

Ciao Sto usando Xpath nel mio script di build Nant per modificare alcune variabili di configurazione tra lo sviluppo e gli altri miei ambienti.xmlpoke in Nant - come aggiornare tutte le istanze della stringa trovata

io ho preso la sintassi da questo esempio:

L'esempio si presenta così:

<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 basta cambiarli semplicemente con" localhost "

È possibile?

risposta

4

Giocando 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. Modificare la stringa è più facile fatto con un po 'di C#, quindi, utilizzando un compito script per fare una ricerca e sostituzione regex:

<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> 
+0

Grazie Peter - ottima soluzione! – Remotec

+0

Questo è stato davvero utile. –

0

XPath seleziona solo i nodi, non può modificare i nodi.

Un modo per ottenere le modifiche necessarie è 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 cambiati.

+0

XPath seleziona solo i nodi, ma xmlpoke (la funzione NAnt) cambia il nodo selezionato per XPath. Xmlpoke è di che cosa si tratta. – azheglov

+0

@azheglov: Questa domanda è contrassegnata come "xpath". Anche la frase "Sto usando XPath per cambiare ..." non è corretta. L'OP desidera che le espressioni XPath "eseguano ricerche nelle stringhe di connessione" ma non fornisce il documento XML su cui devono essere applicate le espressioni XPath, pertanto questa è una domanda incompleta. Questo è tutto ciò che ho espresso nella mia risposta. –