Изменение XML через командную строку - PullRequest
8 голосов
/ 09 марта 2011

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

Мне также нужно это как инструмент командной строки, чтобы упростить развертывание.

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

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

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

Какой, по вашему мнению, «лучший инструмент для работы?»

Ответы [ 3 ]

4 голосов
/ 09 марта 2011

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

Файл конфигурации app.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 скопирует все из исходного файла app.config и добавит узел <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

4 голосов
/ 09 марта 2011

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

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

  2. nxslt.exe Олега Ткаченко утилита командной строки для XslCompiledTransform - thisявляется частью проекта Mvp.Xml .

3 голосов
/ 09 марта 2011

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

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

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

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