Web.config转换和搜索和替换

时间:2012-01-20 12:49:59

标签: web-config web-config-transform config-transformation

我需要在web.config中的多个WCF服务中切换出一个IP地址。使用web.config转换,除了通过xpath指定每个地址之外,还有什么方法可以创建搜索和替换语句。例如。对于1.2.3.4

的所有实例,用4.3.2.1切换IP地址1.2.3.4

1 个答案:

答案 0 :(得分:3)

假设您的Web.config是这样的(一个简化的场景,但//在XPath中无处不在):

<configuration>
    <endpoint address="1.2.3.4" />
    <endpoint address="1.2.3.4" />
    <endpoint address="1.2.3.4" />
    <endpoint address="1.2.3.4" />
</configuration>
那么你需要这样的东西:

<?xml version="1.0"?>    
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->    
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

    <replaceAll>
        <endpontAddresses xdt:Locator="XPath(//endpoint[@address='1.2.3.4'])" xdt:Transform="SetAttributes(address)" address="4.3.2.1" />
    </replaceAll>

</configuration>

注意:此XPath将查找整个Web.config中的每个 元素,并检查给定元素是否具有值等于“1.2.3.4”的地址属性。 如果你需要更通用的东西,那就试试这个:

<?xml version="1.0"?>
    <!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->    
    <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

        <replaceAll>
            <endpontAddresses xdt:Locator="XPath(//*[@address='1.2.3.4'])" xdt:Transform="SetAttributes(address)" address="4.3.2.1" />
        </replaceAll>

    </configuration>

这将查看每个XML元素(由于星号:*)并检查它是否具有值等于“1.2.3.4”的地址属性。 所以这适用于这样的文件:

<configuration>
    <endpoint name="serviceA" address="1.2.3.4" />
    <endpoint name="serviceB" address="1.2.3.4" />
    <endpoint name="serviceC" address="1.2.3.4" />
    <endpoint2 address="1.2.3.4" />
    <endpoint3 address="1.2.3.4" />
    <endpoint4 address="1.2.3.4" />

    <innerSection>
    <endpoint address="1.2.3.4" />
    <anotherEndpoint address="1.2.3.4" />
    <sampleXmlElement address="1.2.3.4" />
    </innerSection>
</configuration>

现在,如果您想将替换限制为某个部分,即<system.serviceModel>,那么您可以使用这样的XPath:

    <endpontAddresses xdt:Locator="XPath(/configuration/system.serviceModel//*[@address='1.2.3.4'])" xdt:Transform="SetAttributes(address)" address="4.3.2.1" />

这将仅在<system.serviceModel>部分

中更新地址
<configuration>
    <endpoint name="serviceA" address="1.2.3.4" />
    <endpoint name="serviceB" address="1.2.3.4" />
    <endpoint name="serviceC" address="1.2.3.4" />
    <endpoint2 address="1.2.3.4" />
    <endpoint3 address="1.2.3.4" />
    <endpoint4 address="1.2.3.4" />

    <innerSection>
    <endpoint address="1.2.3.4" />
    <anotherEndpoint address="1.2.3.4" />
    <sampleXmlElement address="1.2.3.4" />
    </innerSection>

    <system.serviceModel>
    <endpoint name="serviceB" address="1.2.3.4" />
    <endpoint name="serviceC" address="1.2.3.4" />
    <endpoint2 address="1.2.3.4" />
    <innerSection>
      <endpoint address="1.2.3.4" />
      <anotherEndpoint address="1.2.3.4" />
      <sampleXmlElement address="1.2.3.4" />
      </innerSection>
    </system.serviceModel>

</configuration>

尝试一下,选择最适合您需求的那个。

注意:这有一个限制,您需要指定包含IP的属性的名称(1.2.3.4),但我认为最好是显式而不是在这里发生魔术。如果您有许多名称,请重复