2009-08-13 24 views
10

Używam MSBuild i MSBuild Community Tasks (przy użyciu XMLUpdate i XMLMassUpdate), aby zaktualizować różne sekcje mojego Web.config jedna rzecz mnie wprawiła w zakłopotanie. Jeśli mam:Jak zaktualizować atrybut XML ze skryptu 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> 

i staram się zastąpić fileName z target

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

sprawozdaniach jako w stanie znaleźć coś do aktualizacji, więc moje pytanie brzmi: w jaki sposób mogę uzyskać atrybut nazwy pliku zaktualizować?


EDIT: może to być przypadek starć przestrzeni nazw jako sekcja NLog definiuje własną przestrzeń nazw?


UPDATE: Oddelegowany odpowiedź deklarowania przestrzeni nazw nie działa.

Odpowiedz

20

Pierwszy problem polega na tym, że xpath jest niepoprawna do aktualizacji atrybutu, obecnie szuka węzłów "docelowych" z atrybutem o nazwie "fileName" zamiast atrybutu "fileName" węzła o nazwie "target".

XPath chcesz to: /konfiguracja/nlog/cele/target/@ fileName

Co do kwestii obszaru nazw, Preet Sangha has the correct answer for that, trzeba użyć przedrostka przestrzeni nazw, a ta musi być stosowana do każdego sub -element, ponieważ wszystkie są w tym obszarze nazw.

Ostateczne rozliczenie jest:

<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

To działało jak czar .... bardzo dziękuję! – Dean

4

Here oznacza to wymóg przestrzeni nazw

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

można zaktualizować dowolny inny atrybut?

+0

To jest pomocne, ale nie rozwiązuje problemu pod ręką Mam inne zadania XMLUpdate, które nie deklarują przestrzeni nazw, ale aktualizują się poprawnie – Dean

3

Aby zakończyć odpowiedź udzieloną przez keeperofthesoul(myślę, że należy dać mu nagrodę btw) przyjrzeć:

<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" 
    /> 

tu "Używam %24 do wypisania specjalnego znaku $.

Powiązane problemy