Как правильно ссылаться на пространство имен для Microsoft.Sdc.Tasks.XmlFile.GetValue
Я хочу использовать MSBuild для вставки пользовательского элемента XML в web.config. Посмотрев онлайн, я нашел такое решение:
1) Хранить элемент в файле.build в projectextensions
<ProjectExtensions>
<CustomElement name="CustomElementName">
...
</CustomElement>
</ProjectExtensions>
2) Получить элемент с помощью GetValue
<Target name="ModifyConfig">
<XmlFile.GetValue Path="$(MSBuildProjectFullPath)"
XPath="Project/ProjectExtensions/CustomElement[@name='CustomElementName']">
<Output TaskParameter="Value" PropertyName="CustomElementProperty"/>
</XmlFile.GetValue>
</Target>
Это не будет работать, так как мне нужно сослаться на пространство имен, которое использует проект.build, чтобы найти нужный элемент (проверил файл.build с XPath Visualizer). Итак, я ищу дальнейшее решение и прихожу к этому:
<ItemGroup>
<XmlNamespace Include="MSBuild">
<Prefix>msb</Prefix>
<Uri>http://schemas.microsoft.com/developer/msbuild/2003</Uri>
</XmlNamespace>
</ItemGroup>
<Target name="ModifyConfig">
<XmlFile.GetValue Path="$(MSBuildProjectFullPath)" Namespaces="$(XmlNamespace)"
XPath="/msb:Project/msb:ProjectExtensions/msb:CustomElement[@name='CustomElementName']"
>
<Output TaskParameter="Value" PropertyName="CustomElementProperty"/>
</XmlFile.GetValue>
</Target>
Но по какой-то причине пространство имен не распознается - MSBuild сообщает о следующей ошибке:
C:... \ mybuild.build (53,9): ошибка: произошла ошибка задачи. C:... \ mybuild.build (53,9): ошибка: Сообщение = префикс пространства имен 'msb' не определен.
Я попробовал несколько вариантов ссылки на него по-другому, но ни одна из них не работает, и не так уж много о правильной ссылке на эти пространства имен в Интернете. Можете ли вы сказать мне, что я делаю неправильно и как это сделать правильно?
1 ответ
Я бы порекомендовал использовать пользовательское задание из MSBuild Community Tasks под названием XmlMassUpdate
для вставки пользовательского элемента XML в файл XML.
<XmlMassUpdate
ContentFile="web.config"
SubstitutionsFile="changes.xml"
ContentRoot="/configuration/system.web"
SubstitutionsRoot="/system.web" />
Вы также можете ссылаться на XML прямо в файле проекта следующим образом:
<XmlMassUpdate ContentFile="web.config" ContentRoot="/configuration/system.web"
NamespaceDefinitions="msb=http://schemas.microsoft.com/developer/msbuild/2003"
SubstitutionsFile="$(MSBuildProjectFullPath)"
SubstitutionsRoot="/msb:Project/msb:ProjectExtensions/msb:system.web" />
Однако, кажется, что ваш вопрос наводит на мысль, что у вас возникли проблемы с получением значений XML, а не их изменением. Упомянутая библиотека также имеет XmlQuery
задача, которая читает значения из файлов XML и заполняет параметры на основе этих значений.