Изменение XML с помощью командной строки

Я ищу лучше способ исправления XML (на самом деле,). Более конкретно, мне нужно добавить что-то в <appConfig> раздел (который может не существовать), а также несколько <bindingRedirect> элементы для сопоставления записей.

мне также нужно это как инструмент командной строки, для более легкого развертывания.

Я думал о решении этого несколькими способами:

  1. специальное консольное приложение для исправления файла с помощью LINQ to XML-самый простой
  2. используя XSLT-сохраните копию измененного XML, позже заменив оригинал (если только не возможно преобразовать исходный XML на месте?)
  3. используя XML Diff и патч кажется, что дельты производится ссылается на точное расположение узла, такие как <xd:node match="1">, etc.

специальной решение является самым простым, но я чувствую, что это немного обман. Я не знаю XSLT очень хорошо, но это звучит как лучший решение...

что ,на ваш взгляд, является " лучшим инструментом для работы?"

3 ответов


вы можете использовать следующие утилиты командной строки XSLT для процессоров Microsoft XSLT:

  1. msxsl.exe (была там почти 10 лет). Выполняет преобразование с помощью MSXML (возможно указание различных версий).

  2. Nxslt Олега Ткаченко.exe утилита командной строки для XslCompiledTransform -- это часть Mvp.В XML проект.


если использование Xslt будет вариантом, вы можете использовать MSBuild для управления преобразованием в командной строке.

настройки приложение файл.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
              <assemblyIdentity name="myAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="neutral" />
              <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
          </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

XSLT в appconfig.в XSLT

этот образец xslt скопирует все из вашего исходного приложения.настройте и добавьте <appSetting /> узел, если он не существует:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="configuration">
        <xsl:element name="configuration">
            <xsl:if test="self::node()[not(appSettings)]">
                <xsl:element name="appSettings" />
            </xsl:if>
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

MSBuild скрипт appconfig.proj

этот пример сценария проекта MSBuild будет копирование / резервное копирование источника app.config и преобразуйте его с заданной таблицей стилей xslt.

<Project ToolsVersion="4.0" DefaultTargets="Transform" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <AppConfigFile Include="app.config" />
    </ItemGroup>

    <Target Name="Clone">
        <Copy SourceFiles="@(AppConfigFile)" DestinationFiles="clone.config">
            <Output TaskParameter="CopiedFiles" ItemName="ClonedConfig" />
        </Copy>
     </Target>

     <Target Name="Transform" DependsOnTargets="Clone">
         <XslTransformation XslInputPath="appconfig.xslt" XmlInputPaths="@(ClonedConfig)" OutputPaths="app.config" />
     </Target>
</Project>

запуск из командной строки

<path to .NET framework 4>\MSBuild.exe appconfig.proj


по моему опыту использование XSLT может работать, но имейте в виду, что вы хотели бы сохранить его. Существует хороший инструмент для построения XSLT visual под названием MapForce я использовал в прошлом, что может помочь.

недавно на работе мне нужно было сделать аналогичную задачу-конвертировать XML-файл из формата A в формат B-использование Linq было самым быстрым и простым, почему и в настоящее время также легко поддерживать.

поэтому мое предложение сделать simlest, что работать и ходить на быстрое решение, если у вас нет явных преимуществ от использования XSLT вместо этого.