如何正确引用Microsoft.Sdc.Tasks.Xml File.GetValue的命名空间

时间:2010-03-29 08:43:29

标签: xml msbuild msbuildcommunitytasks

我想使用MSBuild将自定义xml元素插入到web.config中。在网上查询后,我找到了这样的解决方案:

1)将元素存储在projectextensions

中的.build文件中
<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项目用来找到所需元素的命名空间(用XPath Visualizer检查.build文件)。所以,我想要一个进一步的解决方案,并来到这个:

<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 个答案:

答案 0 :(得分:1)

我建议使用名为XmlMassUpdate的{​​{3}}自定义任务,将自定义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文件读取值并根据这些值填充参数。