2010-05-05 8 views
5

Hola Estoy usando Xpath en mi script de compilación Nant para cambiar algunas variables de configuración entre el desarrollo y mis otros entornos.xmlpoke en Nant - cómo actualizar todas las instancias de la cadena encontrada

yo he tomado la sintaxis de este ejemplo:

El ejemplo es el siguiente:

<xmlpoke 
    file="config01/app.config" 
    xpath="/configuration/appSettings/add[@key='AppName']/@value" 
    value="TradeMonster"> 
</xmlpoke> 

Lo que me gustaría es algo similar a esto para buscar mis cadenas de conexión y encontrar todas las instancias de " localhost \ SqlExpress "y simplemente cámbielos a" localhost "

¿Esto es posible?

Respuesta

4

Jugando con un guión sucia Quick'n aquí ....

Si está seguro de que sólo hay un elemento de connectionstring en cada archivo que puede lograr esto con una combinación de xmlpeek y xmlpoke. La modificación de la cadena es más fácil hacerse con un poco de C#, por lo tanto, utilizando una tarea de secuencia de comandos para hacer una búsqueda de expresiones regulares y reemplazar:

<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

Gracias Peter - ¡gran solución! – Remotec

+0

Esto fue realmente útil. –

0

XPath solo selecciona nodos, no puede cambiar los nodos.

Una forma de lograr los cambios necesarios es realizar una transformación XSLT en el documento XML.

Para que esto suceda, debe proporcionar el documento XML y especificar exactamente cuáles de sus nodos de texto se van a cambiar.

+0

XPath sólo selecciona los nodos, pero xmlpoke (la función de NAnt) cambia el nodo seleccionado por XPath. Xmlpoke es de lo que se trata la pregunta. – azheglov

+0

@azheglov: esta pregunta está etiquetada como "xpath". Incluso la frase "Estoy usando XPath para cambiar ..." es incorrecta. El OP quiere que las expresiones XPath "busquen mis cadenas de conexión", pero no proporciona el documento XML en el que se aplicarán las expresiones XPath, por lo tanto, esta es una pregunta incompleta. Esto es todo lo que he expresado en mi respuesta. –

Cuestiones relacionadas