MSBuild XmlMassUpdate Task - PullRequest
       24

MSBuild XmlMassUpdate Task

5 голосов
/ 18 сентября 2009

Я хотел бы задать быстрый вопрос относительно поведения задачи MSBuild XmlMassUpdate.

Кто-нибудь обнаружил, что задача будет копировать только уникальные узлы в контент XML? Например, если у меня есть клиентский узел с несколькими дочерними узлами, называемый конечной точкой, он будет только массово копировать первый узел конечной точки, исключая при этом все остальные.

Я привел ниже несколько примеров того, что я описываю, большое спасибо заранее.

MSBuild Задача:

<Project DefaultTargets="Run" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.targets" />
    <Target Name="Run">
        <Delete Condition="Exists('web.config')" Files="web.config"/>
        <XmlMassUpdate 
            ContentFile="app.config"
            ContentRoot="configuration/system.servicemodel"
            SubstitutionsFile="wcf.config"
            SubstitutionsRoot="/system.servicemodel"
            MergedFile="web.config"
            />
    </Target>
</Project>

Содержание:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.servicemodel/>
</configuration>

Замена:

<?xml version="1.0" encoding="utf-8" ?>
<system.servicemodel>
    <client>
        <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_LargeMessage"
                  contract="ClaimsService.IClaimsService" 
                  name="WSHttpBinding_IClaimsService">
        </endpoint>
        <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_LargeMessage"
                  contract="LateCertificationAdminService.ILateCertificationAdminService" 
                  name="WSHttpBinding_ILateCertificationAdminService">
        </endpoint>
    </client>
</system.servicemodel>

Выход:

<?xml version="1.0" encoding="utf-8" ?>
<system.servicemodel>
    <client>
        <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_LargeMessage"
                  contract="ClaimsService.IClaimsService" 
                  name="WSHttpBinding_IClaimsService">
        </endpoint>
    </client>
</system.servicemodel>

1 Ответ

6 голосов
/ 23 декабря 2009

Раздел справки XmlMassUpdate, включенный в файл справки MSBuildCommunityTasks, показывает примеры работы с несколькими элементами с одинаковыми именами.

Вам необходимо различать элементы, используя уникальный атрибут, этот атрибут будет определен как «ключ» XmlMassUpdate. В вашем случае атрибут name будет работать. Я полагаю, что этот обновленный код Замены ниже исправит вашу проблему, обратите внимание на атрибуты xmu.

<?xml version="1.0" encoding="utf-8" ?>
<system.servicemodel>
    <client xmlns:xmu="urn:msbuildcommunitytasks-xmlmassupdate">
        <endpoint   xmu:key="name" 
                    binding="wsHttpBinding" 
                    bindingConfiguration="WSHttpBinding_LargeMessage"
                    contract="ClaimsService.IClaimsService"
                    name="WSHttpBinding_IClaimsService">
        </endpoint>
        <endpoint   xmu:key="name"
                    binding="wsHttpBinding" 
                    bindingConfiguration="WSHttpBinding_LargeMessage"
                    contract="LateCertificationAdminService.ILateCertificationAdminService"
                    name="WSHttpBinding_ILateCertificationAdminService">
        </endpoint>
    </client>
</system.servicemodel>
...