Как правильно ссылаться на пространство имен для Microsoft.Sdc.Tasks.XmlFile.GetValue - PullRequest
0 голосов
/ 29 марта 2010

Я хочу использовать 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 Ответ

1 голос
/ 29 марта 2010

Я бы рекомендовал использовать пользовательскую задачу из Задачи сообщества MSBuild с именем 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 и заполняет параметры на основе этих значений.

...