Dot-Net

通過命令行修改 XML

  • March 9, 2011

我正在尋找一種更好的方法來修補 XML(實際上是app.config文件)。更具體地說,我需要向該<appConfig>部分添加一些內容(可能不存在),以及<bindingRedirect>匹配條目的幾個元素。

我還需要它作為命令行工具,以便於部署。

我想通過幾種方式解決這個問題:

  1. 使用 LINQ to XML 修補文件的臨時控制台應用程序 - 最簡單
  2. 使用 XSLT - 保存修改後的 XML 的副本,稍後替換原始的(除非可以就地轉換源 XML?)
  3. 使用XML Diff 和 Patch,但是生成的 diffgram 似乎指的是確切的節點位置,例如<xd:node match="1">等。

臨時解決方案是最簡單的,但我覺得它有點作弊。我不太了解 XSLT,但這聽起來像是最好的解決方案……

在您看來,什麼是“完成這項工作的最佳工具”?

您可以為 Microsoft XSLT 處理器使用以下 XSLT 命令行實用程序:

  1. msxsl.exe(已經存在將近 10 年了)。使用 MSXML 執行轉換(可以指定不同的版本)。
  2. **Oleg Tkachenko 的用於 XslCompiledTransform 的 nxslt.exe 命令行實用程序——這是Mvp.Xml**項目的一部分。

如果使用 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

引用自:https://stackoverflow.com/questions/5244141