Как мне обновить атрибут XML из скрипта MSBuild?

Я использую задачи сообщества MSBuild и MSBuild (используя XMLUpdate и XMLMassUpdate) для обновления различных разделов моего Web.config, но одна вещь меня озадачила. Если у меня есть:

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

и я пытаюсь заменить fileName из target

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

Он сообщает, что не может найти что-либо для обновления, поэтому мой вопрос: как я могу обновить атрибут имени файла?


РЕДАКТИРОВАТЬ: Может ли это быть случай столкновения пространства имен, так как раздел NLog определяет свое собственное пространство имен?


ОБНОВЛЕНИЕ: опубликованный ответ, объявляющий пространство имен, не работает.

3 ответа

Решение

Первая проблема - неправильный xpath для обновления атрибута, в настоящее время он ищет "целевые" узлы с атрибутом с именем "fileName", а не с атрибутом "fileName" узла с именем "target".

Нужный xpath: /configuration/nlog/target /target/@fileName

Что касается проблемы с пространством имен, то у Преета Сангхи есть правильный ответ на этот вопрос, вам необходимо использовать префикс пространства имен, и это также должно применяться к каждому подэлементу, поскольку все они находятся в этом пространстве имен.

Заключительное утверждение:

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

Здесь это указывает на требование пространства имен

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

Вы можете обновить любой другой атрибут?

Чтобы завершить ответ, данный Chris Chilvers (я думаю, вы должны дать ему награду между прочим), взгляните на:

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

Здесь я использую %24 выписать специальный символ $,

Другие вопросы по тегам