我可以使用Web Deploy将元素插入到web.config中吗?

时间:2011-04-19 16:41:47

标签: .net xslt xpath msdeploy webdeploy

是否可以使用Web Deploy的Parameters.xml system将XML元素插入到我的web.config中?

XmlFile 参数“kind”似乎最接近我的需要,但其match属性只接受XPath查询,我似乎无法在我的XPath查询中指定一个不存在的元素。 (或者说,我可以指定一个不存在的元素 - Web Deploy只是忽略它。)具体来说,我想改变它:

<configuration>
   <plugins>
      <add name="bleh"/>
   </plugins>
</configuration>

进入这个:

<configuration>
   <plugins>
      <add name="bleh">
        <option name="foo" value="bar"/>
      </add>
   </plugins>
</configuration>

(遗憾的是,我无法预先使用空option元素预先存储web.config,因为此特定插件系统不喜欢无法识别/空选项。)

感谢您的任何想法!

4 个答案:

答案 0 :(得分:3)

现在可以从Web Deploy V3开始。 请参阅official documentation

  

这是一个parameters.xml文件的示例,它将newNode添加到所有节点,包括目标xml文件中的根目录:

<parameters>
  <parameter name="Additive" description="Add a node" defaultValue="&lt;newNode />" tags="">
    <parameterEntry kind="XmlFile" scope=".*" match="//*" />
  </parameter>
</parameters>

答案 1 :(得分:1)

Xpath只是XML文档的查询语言 - 它本身不能更改XML文档或创建新的XML文档

专为转换XML文档而设计的语言称为XSLT。

这是一个非常简短的XSLT转换,可以解决您的问题

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="add[@name='bleh']">
  <xsl:copy>
   <xsl:copy-of select="@*"/>
   <option name="foo" value="bar"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档

<configuration>
    <plugins>
        <add name="bleh"/>
    </plugins>
</configuration>

产生了想要的正确结果

<configuration>
   <plugins>
      <add name="bleh">
         <option name="foo" value="bar"/>
      </add>
   </plugins>
</configuration>

答案 2 :(得分:1)

您是否考虑过使用configSource?这允许您将配置文件拆分为多个较小的文件。 web.config将来自:

<configuration>
   <plugins>
      <add name="bleh"/>
   </plugins>
</configuration>

使用configSource:

<configuration>
   <plugins configSource="plugins.config"/>
</configuration>

缺点是在部署期间,您将无法获得用于编辑配置值的良好UI。如果您无法使参数化工作,则需要考虑这一点。如果您正在使用安装UI,则可以为管理员编写可以创建和修改plugin.xml文件的编辑工具。

答案 3 :(得分:0)

您可以使用常规的web.config转换实践吗? http://blogs.msdn.com/b/webdevtools/archive/2009/05/04/web-deployment-web-config-transformation.aspx

您可以执行以下代码,该代码将使用下面的代码替换您的所有部分。实际上,如果是你的Web.Release.config文件,你在问题中的内容应该用你提供的部分替换整个部分。

Web.Release.config:

<plugins>
  <add name="bleh">
     <option name="foo" value="bar"/>
  </add>
</plugins>