如何将VS2010的web.config转换应用于具有命名空间属性的元素?

10

我想使用新的VS2010 web.config变换功能,在我的web.config文件中更改nhibernate配置中的连接字符串。相关代码片段如下:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
  </configSections>

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</property>
      <property name="connection.connection_string">(test connection string)</property>
      <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
...

我尝试使用以下转换,但没有成功:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
        <session-factory>
            <property name="connection.connection_string" xdt:Transform="Replace">(production connection string)</property>
        </session-factory>
    </hibernate-configuration>
</configuration>

问题似乎出现在nhibernate-configuration元素的xmlns属性中。

在部署过程中,应该采取什么正确的转换方法来用(生产环境的连接字符串)替换(测试环境的连接字符串)?

4个回答

15

我最近遇到了同样的问题 - 通过在转换文件中放置显式命名空间前缀,问题得到解决

<configuration
               xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"
               xmlns:hib="urn:nhibernate-configuration-2.2"
              >
    <hib:hibernate-configuration>
        <hib:session-factory>
            <hib:property name="connection.connection_string" xdt:Transform="Replace">(production connection string)</hib:property>
        </hib:session-factory>
    </hib:hibernate-configuration>
</configuration>

经过转换后的web.config文件幸好没有命名空间前缀(即它将nhibernate命名空间声明保留在原始的位置,并正确命名了所有节点)。


我还需要添加定位器匹配才能使我的工作正常:<hib:property name="connection.connection_string" xdt:Transform="Replace" xdt:Locator="Match(name)">Data Source=Production.db</hib:property> - Chris Conway
1
我创建了一个测试配置转换的工具,也许它可以帮到你:http://webconfigtransformationtester.apphb.com/ - friism
对我来说也可以工作,但替换的元素中注入了 xmlns:hib="..." :( - Dmitrii Lobanov

7
答案可能有点晚,但是因为我也需要这个,所以我想发布一个对我有效的答案,以便其他人在遇到这个问题时可以参考。
您需要使用xdt:Locator与xpath表达式相结合才能获取正确的节点。因此,像这样的内容应该可以工作。
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
   <session-factory>
      <property name="connection.connection_string" xdt:Locator="XPath(//*[local-name()='hibernate-configuration']//*[local-name()='property'][@name='connection.connection_string'])" xdt:Transform="Replace">(production connection string)</property>
   </session-factory>
</hibernate-configuration>

可能会有更好的xpath表达式,但这是对我有效的。

唯一的问题是替换后的节点将在节点上重新声明命名空间,不过这并不是什么大问题。因此,在最终输出中,替换后的节点实际上会像这样显示:

<property name="connection.connection_string" xmlns="urn:nhibernate-configuration-2.2">(production connection string)</property>

1

如果你只是想转换连接字符串,不要使用转换机制。相反,在你的 web.config 或 app.config 中引用这个属性。

connection.connection_string_name

使用这个替代它:

connection.connection_string

这样可以让您引用在ConnectionStrings部分定义的连接字符串,该字符串通常会被转换。

例如,在web.config中使用以下代码:

<connectionStrings>
  <add name="DefaultConnection" connectionString="server=MYSERVER; Integrated Security=SSPI; database=MYDATABASE"/>
</connectionStrings>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string_name">DefaultConnection</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
    <property name="current_session_context_class">web</property>
    <property name="show_sql">true</property>
  </session-factory>
</hibernate-configuration>

0

由于session-factory包含一组子元素,您需要使用Match定位器告诉它要替换哪个子元素。

<?xml version="1.0"?>
    <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
        <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
            <session-factory>
                <property name="connection.connection_string" xdt:Transform="Replace" xdt:Locator="Match(name)>(production connection string)</property>
            </session-factory>
        </hibernate-configuration>
    </configuration>

我已经尝试过了,但转换步骤甚至不能定位“hibernate-configuration”节点...很可能是由于它的 xmlns 属性造成的。 - gschuager
我知道我在抓虚影,但在放弃之前,我最后尝试的一件事是消除 hibernate 配置元素中多余的空格,以使配置完全匹配。我已编辑上面的代码以反映我所说的内容。 - Chris Staley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接