2010-03-29 1 views
0

Я хочу использовать MSBuild для вставки собственного XML-элемента в web.config. После поиска в Интернете, я нашел такое решение:Как правильно ссылаться на пространство имен для Microsoft.Sdc.Tasks.XmlFile.GetValue

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): error: Message = Префикс пространства имен 'msb' не равен .

Я пробовал несколько вариантов ссылки на него по-другому, но никто не работает, и не так уж много о том, чтобы правильно ссылаться на эти пространства имен в Интернете. Можете ли вы сказать мне, что я делаю неправильно и как это сделать?

+0

Обнаружил ошибку - должен был использоваться @ при ссылке на элемент из Itemgroup, а не на $. Так что на самом деле это должно выглядеть Namespaces = "@ (XmlNamespace)" –

ответ

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 первый не изменяя их. У упомянутого lib также есть задача XmlQuery, которая считывает значения из файлов XML и заполняет параметры на основе этих значений.

+0

Я раньше не работал с XmlMassUpdate, но, как я вижу из начального поиска, это лучше всего использовать для подстановок, тогда как мне нужно получить элемент и вставить его в определенное место в иерархии xml целевого документа. Возможно ли это с помощью XmlMassUpdate? –

+0

Я бы подумал, что это должно быть возможно - да. Возможно, вы можете обновить один тег несколькими? – mfloryan

+0

Это похоже на решение, но я бы предпочел использовать Microsoft.Sdc.XMLFile.AddElement для этой задачи. Спасибо за ваш вход mfloryan, я попробую XMLMassUpdate, если я не найду способ правильно ссылаться на пространство имен для GetValue. –