Допустим, ваш 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), но я думаю, что лучше быть явным, чем иметь магию. Если у вас много имен, просто повторите