Как мне обновить атрибут 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
выписать специальный символ $
,