我想使用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'不是 定义
我尝试了一些不同的引用它的变体,但没有一个工作,并且也没有太多关于在线引用这些命名空间。你能告诉我我做错了什么以及如何做到这一点?
答案 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文件读取值并根据这些值填充参数。