如何插入 app.config 部分或更改它(如果它已经存在)
How to insert an app.config section or change it if it is already there
我有以下简化的 app.config .NET 4.7 应用程序文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
<runtime>
</runtime>
</configuration>
现在,如果该部分尚不存在,我需要将名为 Dependencies
的新部分(元素)插入其中。该部分需要有一个名为 MyDependencies
的子元素,它可以包含多个 CustomDependency
元素。这是一个例子:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
<Dependencies>
<MyDependencies>
<CustomDependency Name="UniqueName" Id="12345678-1234-1234-1234-123456781234" AnotherAttribute="CustomValue"/>
</MyDependencies>
</Dependencies>
<runtime>
</runtime>
</configuration>
但是,如果具有特定名称的 CustomDependency
元素已经存在,则只需要更改该元素(Id
和 AnotherAttribute
)的属性值。这应该通过使用提交给 XSLT 文件的参数来完成。
因此,输入可能如下所示:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
<Dependencies>
<MyDependencies>
<CustomDependency Name="UniqueName" Id="ABC45678-1234-1234-1234-123456781234" AnotherAttribute="WrongValue"/>
<CustomDependency Name="UniqueName2" Id="87654321-1234-1234-1234-123456781234" AnotherAttribute="CustomValue2"/>
</MyDependencies>
<YourDependencies>
<CustomDependency Name="UniqueName2" Id="ABC54321-1234-1234-1234-123456781234" AnotherAttribute="CustomValue2"/>
</YourDependencies>
</Dependencies>
<runtime>
</runtime>
</configuration>
在这种情况下,名称为 UniqueName
的元素的属性值,例如
<CustomDependency Name="UniqueName" Id="ABC45678-1234-1234-1234-123456781234" AnotherAttribute="WrongValue"/>
必须更新到
<CustomDependency Name="UniqueName" Id="12345678-1234-1234-1234-123456781234" AnotherAttribute="CustomValue"/>
要实现这一点,XSLT 代码应该是什么样子?
试试这个:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()" name="copy-all">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="/configuration/Dependencies/MyDependencies/CustomDependency[@Name='UniqueName']/@Id">
<xsl:attribute name="Id">CustomValue</xsl:attribute>
</xsl:template>
<xsl:template match="/configuration/Dependencies/MyDependencies/CustomDependency[@Name='UniqueName']/@AnotherAttribute">
<xsl:attribute name="AnotherAttribute">CustomValue</xsl:attribute>
</xsl:template>
<xsl:template match="startup[not(../Dependencies)]">
<xsl:call-template name="copy-all" />
<xsl:element name="Dependencies">
<xsl:element name="MyDependencies">
<xsl:element name="CustomDependency">
<xsl:attribute name="Name">UniqueName</xsl:attribute>
<xsl:attribute name="Id">12345678-1234-1234-1234-123456781234</xsl:attribute>
<xsl:attribute name="AnotherAttribute">CustomValue</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我有以下简化的 app.config .NET 4.7 应用程序文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
<runtime>
</runtime>
</configuration>
现在,如果该部分尚不存在,我需要将名为 Dependencies
的新部分(元素)插入其中。该部分需要有一个名为 MyDependencies
的子元素,它可以包含多个 CustomDependency
元素。这是一个例子:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
<Dependencies>
<MyDependencies>
<CustomDependency Name="UniqueName" Id="12345678-1234-1234-1234-123456781234" AnotherAttribute="CustomValue"/>
</MyDependencies>
</Dependencies>
<runtime>
</runtime>
</configuration>
但是,如果具有特定名称的 CustomDependency
元素已经存在,则只需要更改该元素(Id
和 AnotherAttribute
)的属性值。这应该通过使用提交给 XSLT 文件的参数来完成。
因此,输入可能如下所示:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
<Dependencies>
<MyDependencies>
<CustomDependency Name="UniqueName" Id="ABC45678-1234-1234-1234-123456781234" AnotherAttribute="WrongValue"/>
<CustomDependency Name="UniqueName2" Id="87654321-1234-1234-1234-123456781234" AnotherAttribute="CustomValue2"/>
</MyDependencies>
<YourDependencies>
<CustomDependency Name="UniqueName2" Id="ABC54321-1234-1234-1234-123456781234" AnotherAttribute="CustomValue2"/>
</YourDependencies>
</Dependencies>
<runtime>
</runtime>
</configuration>
在这种情况下,名称为 UniqueName
的元素的属性值,例如
<CustomDependency Name="UniqueName" Id="ABC45678-1234-1234-1234-123456781234" AnotherAttribute="WrongValue"/>
必须更新到
<CustomDependency Name="UniqueName" Id="12345678-1234-1234-1234-123456781234" AnotherAttribute="CustomValue"/>
要实现这一点,XSLT 代码应该是什么样子?
试试这个:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()" name="copy-all">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="/configuration/Dependencies/MyDependencies/CustomDependency[@Name='UniqueName']/@Id">
<xsl:attribute name="Id">CustomValue</xsl:attribute>
</xsl:template>
<xsl:template match="/configuration/Dependencies/MyDependencies/CustomDependency[@Name='UniqueName']/@AnotherAttribute">
<xsl:attribute name="AnotherAttribute">CustomValue</xsl:attribute>
</xsl:template>
<xsl:template match="startup[not(../Dependencies)]">
<xsl:call-template name="copy-all" />
<xsl:element name="Dependencies">
<xsl:element name="MyDependencies">
<xsl:element name="CustomDependency">
<xsl:attribute name="Name">UniqueName</xsl:attribute>
<xsl:attribute name="Id">12345678-1234-1234-1234-123456781234</xsl:attribute>
<xsl:attribute name="AnotherAttribute">CustomValue</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>