Попытка использовать задачу MSBuild <Xml.ModifyFile> от Microsoft.Sdc.Common.tasks - PullRequest
0 голосов
/ 06 апреля 2009

У меня проблема с задачей Xml.ModifyFile, которую я не понимаю. Ребята, вы можете помочь?

Моя цель - просто манипулировать атрибутом в XML-документе.

Я довольно новичок в мире xml и, особенно, в msbuild, поэтому мне сложно интерпретировать полученное сообщение об ошибке. Мне кажется, что мой файл сборки действителен, поэтому я предполагаю, что что-то не так в файле sdc.tasks.

Как видно из файла сборки, я добавил цель под названием "ping" для тестирования. Эта цель работает с пингом sdc.task без проблем

Можете ли вы, ребята, предложить исправление или альтернативное решение проблемы изменения XML-файлов с помощью msbuild.

Дополнительный вопрос - как объявить несколько пространств имен в качестве аргумента для xml.ModifyFile sdc.task? Объяснение атрибута пространства имен выглядит следующим образом: Массив TaskItems, задающий атрибуты «Префикс» и «Uri» для использования с указанным xPath . Я попытался найти объяснение или пример использования задач, но, к сожалению, безуспешно.

спасибо / derdres

Я перечислю следующее:

  1. файл сборки
  2. XML-файл, который я пытаюсь изменить
  3. сообщение об ошибке

1) файл сборки

<Target Name="Go">
    <CallTarget Targets="modify"></CallTarget>
    <!--<CallTarget Targets="ping"></CallTarget>-->
</Target>

<Target Name="modify">
    <Xml.ModifyFile
        Path="C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\bookstore_adv.xml"
        AttributeName="age"
        Force="true"
        XPath="/bookstore/book[@id=2]/@age"
        NewValue="200"
        ShowMatches="Yes"
    >
    </Xml.ModifyFile>

    <Message Text="After modification"></Message>
</Target>

<!--<Target Name="ping">
    <Ping
           Machine="localhost"
           Count="2"
           Interval="1000"
           Timeout="3000"
           BufferSize="1024"
           AllowFragmentation="false"
           TimeToLive="128"
           StopOnSuccess="true"
           LogSuccess="true">
        <Output TaskParameter="FailureCount" PropertyName="FailedPingCount" />
        <Output TaskParameter="RoundTripTime" PropertyName="RoundTripDuration" />
    </Ping>
    <Message Text="FailedPingcount: $(FailedPingCount)"></Message>
    <Message Text="RoundTripDuration: $(RoundTripDuration)"></Message>
</Target>-->

2) XML-файл

<?xml version="1.0" encoding="utf-8"?>
<!--<bookstore xmlns:hat="www.google.dk/hat" xmlns:briller="www.google.dk/briller">-->
<!--<bookstore xmlns:hat="www.google.dk/hat">-->
<bookstore>
   <book id="1">
        <title>Harry Potter</title>
        <author>Rowling</author>
   </book>
   <book id="2" age="100">
       <title>Lykke Per</title>
       <author>Pontoppidan</author>
   </book>

3) Сообщение об ошибке сборки

Build FAILED.

"C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj" (default target) (1) ->
(modify target) ->
  C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error : A task error has occured.\r 
C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error : Message            = Object reference not set to
 an instance of an object.\r
C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error : Action             = Replace\r
C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error : Path               = C:\Users\Andreas\Desktop\MS
Build\Test_05_april\Test01\bookstore_advanced.xml\r
C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error : Namespace          = <null>\r
C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error : XPath              = /bookstore/book[@id=2]/@age
\r
C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error : RegularExpression  = <String.Empty>\r
C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error : NewValue           = 200\r
C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error : AttributeName      = age\r
C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error : Force              = True\r
C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error : TreatNewValueAsXml = False\r
C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error : ShowMatches        = Yes\r
C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error : \r
C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error :    at Microsoft.Sdc.Tasks.Xml.ModifyFile.Interna
lExecute() in c:\projects\codeplex\sdctasks\Solutions\Main\Tasks\Xml\ModifyFile.cs:line 346\r
C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\Deploy.proj(11,9): error :    at Microsoft.Sdc.Tasks.TaskBase.Execute() in
c:\projects\codeplex\sdctasks\Solutions\Main\Tasks\TaskBase.cs:line 66

    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:00.20

Ответы [ 2 ]

2 голосов
/ 07 апреля 2009

В вашем XPath вы ищете атрибут age /bookstore/book[@id=2]/@age, но в вашей задаче вы устанавливаете AttributeName равным "age". Таким образом, вы хотите, чтобы атрибут age атрибута age.

Вам просто нужно изменить свой XPath на /bookstore/book[@id=2], чтобы он заработал.

<Target Name="modify">
  <Xml.ModifyFile
    Path="C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\bookstore_adv.xml"
    AttributeName="age"
    Force="true"
    XPath="/bookstore/book[@id=2]"
    NewValue="200"
    ShowMatches="Yes">
  </Xml.ModifyFile>

  <Message Text="After modification"/>
</Target>

Как объявить несколько пространств имен в качестве аргумента для xml.ModifyFile sdc.task?

<ItemGroup>
  <Namespace Include="www.google.dk/briller">
    <Prefix>briller</Prefix>
    <Uri>www.google.dk/briller</Uri>
  </Namespace>
  <Namespace Include="www.google.dk/hat">
    <Prefix>hat</Prefix>
    <Uri>www.google.dk/hat</Uri>
  </Namespace>
</ItemGroup>

<Target Name="modify">
  <Xml.ModifyFile
    Path="C:\Users\Andreas\Desktop\MSBuild\Test_05_april\Test01\bookstore_adv.xml"
    AttributeName="age"
    Force="true"
    XPath="/bookstore/book[@id=2]"
    NewValue="200"
    ShowMatches="Yes"
    Namespace="@(Namespace)">
  </Xml.ModifyFile>

  <Message Text="After modification"/>
</Target>
0 голосов
/ 27 октября 2009

Ваш XML-файл недействителен. Я попробовал его на своей машине, и он работал нормально.

Just Close книжный магазин Tag.

...