2009-08-13 8 views
10

Estoy usando MSBuild y MSBuild Community Tasks (usando XMLUpdate y XMLMassUpdate) para actualizar varias secciones de mi Web.config pero una cosa me tiene perplejo. Si tengo:¿Cómo actualizo un atributo XML de un script de MSBuild?

<configuration> 
    <nlog throwExceptions="true" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <targets> 
      <target name="file" xsi:type="File" fileName="${logDirectory}\SomeLog.log" layout="${message}"/> 
     </targets> 
    </nlog> 
</configuration> 

y trato de reemplazar el fileName del target

<XmlUpdate XmlFileName="$(BuildDir)\Builds\%(Configuration.Identity)\_PublishedWebsites\Presentation\Web.config" 
      XPath="//configuration/nlog/targets/target[@fileName]" 
      Value="${logDirectory}\SomeLog_%(Configuration.Identity).log" /> 

Se informa que al no poder encontrar nada para actualizar, por lo que mi pregunta es ¿cómo puedo obtener el atributo de nombre de archivo ¿actualizado?


EDIT: Podría ser este un caso de choques de espacio de nombres como la sección Nlog define su propio espacio de nombres?


ACTUALIZACIÓN: La respuesta publicado declarar el espacio de nombres no funciona.

Respuesta

20

El primer problema es que xpath es incorrecto para actualizar el atributo, actualmente está buscando nodos "objetivo" con un atributo llamado "nombre archivo" en lugar del atributo "nombre archivo" de un nodo llamado "destino".

El XPath que desea es: /configuración/n log/blancos/blanco/@ nomArchivo

En cuanto a la cuestión de espacio de nombres, Preet Sangha has the correct answer for that, es necesario utilizar el prefijo de espacio de nombres, y esto se debe aplicar a todos los sub -el elemento también, ya que están todos en ese espacio de nombres.

El ser última declaración:

<XmlUpdate 
    Prefix="n" 
    Namespace="http://www.nlog-project.org/schemas/NLog.xsd" 
    XmlFileName="output.xml" 
    XPath="//configuration/n:nlog/n:targets/n:target/@fileName" 
    Value="${logDirectory}\UpdateWorked.log" /> 
+0

Esto funcionó como un amuleto ... ¡muchas gracias! – Dean

4

Here que indica el requerimiento de un espacio de nombres

<XmlUpdate 
    Namespace="http://schemas.microsoft.com/.NetConfiguration/v2.0" 
    XmlFileName .... 

se puede actualizar cualquier otro atributo?

+0

Esto es útil pero no resuelve el problema. Tengo otras tareas XMLUpdate que no declaran el espacio de nombres pero se actualizan correctamente – Dean

3

Para completar la respuesta dada por keeperofthesoul(creo que se le debe dar la recompensa por cierto) echar un vistazo a:

<XmlUpdate 
    XmlFileName="web.config" 
    XPath="//configuration/x:nlog/x:targets/x:target/@fileName" 
    Value="%24{logDirectory}\SomeLog_%(Configuration.Identity).log" 
    Prefix="x" 
    Namespace="http://www.nlog-project.org/schemas/NLog.xsd" 
    /> 

Aquí Estoy usando %24 para escribir el carácter especial $.

Cuestiones relacionadas