代码之家  ›  专栏  ›  技术社区  ›  gschuager

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

  •  10
  • gschuager  · 技术社区  · 16 年前

    我想使用新的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配置元素的xmlns属性中。

    在部署期间,将(测试连接字符串)替换为(生产连接字符串)的正确转换应该是什么?

    4 回复  |  直到 14 年前
        1
  •  7
  •   bgrebil    16 年前

    答案可能会晚一点,但由于我也需要这个,我想我会发布一个对我有用的答案,以防其他人偶然发现这个问题。

    您需要结合使用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>
    
        2
  •  15
  •   Andrew Patterson    16 年前

    我最近遇到了同样的问题——它是通过在转换文件中放置明确的名称空间前缀来解决的。

    <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名称空间声明保留在与 原始web.config文件并正确命名所有节点)

        3
  •  1
  •   Brian Leeming    14 年前

    如果您所要做的只是转换连接字符串,那么不要使用转换机制。相反,在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>
    
        4
  •  0
  •   Chris Staley    16 年前

    由于会话工厂包含子元素集合,因此需要使用匹配定位器告诉它要替换哪个子元素。

    <?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>