Dot-Net
通過命令行修改 XML
我正在尋找一種更好的方法來修補 XML(實際上是
app.config文件)。更具體地說,我需要向該<appConfig>部分添加一些內容(可能不存在),以及<bindingRedirect>匹配條目的幾個元素。我還需要它作為命令行工具,以便於部署。
我想通過幾種方式解決這個問題:
- 使用 LINQ to XML 修補文件的臨時控制台應用程序 - 最簡單
- 使用 XSLT - 保存修改後的 XML 的副本,稍後替換原始的(除非可以就地轉換源 XML?)
- 使用XML Diff 和 Patch,但是生成的 diffgram 似乎指的是確切的節點位置,例如
<xd:node match="1">等。臨時解決方案是最簡單的,但我覺得它有點作弊。我不太了解 XSLT,但這聽起來像是最好的解決方案……
在您看來,什麼是“完成這項工作的最佳工具”?
您可以為 Microsoft XSLT 處理器使用以下 XSLT 命令行實用程序:
- msxsl.exe(已經存在將近 10 年了)。使用 MSXML 執行轉換(可以指定不同的版本)。
- **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