Как правильно ссылаться на пространство имен для 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 и заполняет параметры на основе этих значений.

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