Как обновить XML-файл с помощью msbuild с двумя пространствами имен? - PullRequest
0 голосов
/ 08 июня 2010

В этой задаче msbuild ниже может учитываться одно пространство имен, но в случае, когда я обновляю mxml (flex), который имеет смесь пространств имен, могу ли я использовать эту задачу или другую задачу msbuild для обновления?

<XmlUpdate
        Prefix="fx"
        Namespace="http://ns.adobe.com/mxml/2009"
      XmlFileName="myFlexApp.mxml"
      Xpath="//mx:Application/fx:Declarations/fx:String[@id='stringId']"
      Value="xxxxx">

Вот файл flex xml, который я пытаюсь обновить:

<mx:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:mx="library://ns.adobe.com/flex/mx" 
            xmlns:s="library://ns.adobe.com/flex/spark">
<fx:Declarations>
    <fx:String id="stringId">UPDATE_ME</fx:String>
</fx:Declarations></mx:Application>

Ответы [ 2 ]

1 голос
/ 08 июня 2010

Мне удалось успешно обновить источник для XmlUpdate, чтобы он занимал несколько пространств имен:

            if (!string.IsNullOrEmpty(_prefix) && !string.IsNullOrEmpty(_namespace))
            {
                string[] prefixes = _prefix.Split(';');
                string[] namespaces = _namespace.Split(';');

                if (prefixes.Length != namespaces.Length)
                    throw new Exception("The number of prefixes is different from the number of namespaces");

                for (int prefixIndex = 0; prefixIndex < prefixes.Length; prefixIndex++)
                {
                    manager.AddNamespace(prefixes[prefixIndex], namespaces[prefixIndex]);                        
                }
            }

Это работает на примере

<XmlUpdate
    Prefix="fx;mx"
    Namespace="http://ns.adobe.com/mxml/2009;library://ns.adobe.com/flex/mx"
  XmlFileName="myFlexApp.mxml"
  Xpath="//mx:Application/fx:Declarations/fx:String[@id='stringId']"
  Value="xxxxx">
0 голосов
/ 08 июня 2010

Вам придется использовать задачу XmlMassUpdate. (Это задание из Задачи сообщества MSBuild )

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- The replacement value is here -->
  <!-- ProjectExtensions keep MSBuild to try to evaluate the content -->
  <ProjectExtensions>
    <ReplacementNode>
      <String id="stringId">CHANGE</String>
    </ReplacementNode>
  </ProjectExtensions>

  <Target Name="XmlUpdate">
    <XmlMassUpdate 
      ContentFile="myFlexApp.mxml"   
      NamespaceDefinitions="msb=http://schemas.microsoft.com/developer/msbuild/2003;
                           fx=http://ns.adobe.com/mxml/2009;
                           mx=library://ns.adobe.com/flex/mx" 
      ContentRoot="//mx:Application/fx:Declarations/fx:String[@id='stringId']" 
      SubstitutionsFile="$(MSBuildProjectFullPath)" 
      SubstitutionsRoot="msb:Project/msb:ProjectExtensions/msb:ReplacementNode/msb:String"/>
  </Target>
</Project>

Изменение значения во время исполнения

Сложность в том, что вы не можете определить значение на лету, используя только XmlMassUpdate, вам нужно будет использовать XmlUpdate, чтобы сначала обновить значение в вашем замещающем узле.

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- The replacement value is here -->
  <!-- ProjectExtensions keep MSBuild to try to evaluate the content -->
  <ProjectExtensions>
    <ReplacementNode>
      <String id="stringId">CHANGE</String>
    </ReplacementNode>
  </ProjectExtensions>

  <Target Name="XmlUpdate" DependsOnTargets="ChangeXmlValue">
    <XmlMassUpdate 
      ContentFile="myFlexApp.mxml"   
      NamespaceDefinitions="msb=http://schemas.microsoft.com/developer/msbuild/2003;
                           fx=http://ns.adobe.com/mxml/2009;
                           mx=library://ns.adobe.com/flex/mx" 
      ContentRoot="//mx:Application/fx:Declarations/fx:String[@id='stringId']" 
      SubstitutionsFile="$(MSBuildProjectFullPath)" 
      SubstitutionsRoot="msb:Project/msb:ProjectExtensions/msb:ReplacementNode/msb:String"/>
  </Target>

  <Target Name="ChangeXmlValue">
    <XmlUpdate Prefix="n" 
               Namespace="http://schemas.microsoft.com/developer/msbuild/2003" 
               XPath="n:Project/n:ProjectExtensions/n:ReplaceNode/n:String/text()" 
               XmlFileName="$(MSBuildProjectFullPath)" 
               Value="$(NewValue)" />
  </Target>

</Project>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...