8

好的,这是我的 web.config 文件的片段:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<location path="." inheritInChildApplications="false">
<connectionStrings>
...
</connectionStrings>
</location>
<location path="." inheritInChildApplications="false">
<appSettings>
<!--IT Ops-->
<add key="SomeOtherKey" value="SomeOtherValue" />
<add key="SiteDomain" value="somedomain.com" />
<add key="SomeOtherKey" value="SomeOtherValue" />
....
</appSettings>
</location>
</configuration>

我要做的是通过 Powershell 使用 xPath 找到节点。关于这个 XML 文件有几点需要注意:

有多个:

<location path="." inheritInChildApplications="false"> 

xml 文件中的值。它们围绕其他节点,例如等...

我可以使用此脚本成功找到并替换连接字符串值

$WebConfigFile = Join-Path $destination Web.config
[xml]$WebConfigXml = Get-Content ($WebConfigFile)
$WebConfigXml.configuration.location[2].connectionStrings.add | % { $_.connectionString = $_.connectionString -replace "some value", $sqlServerName }

但是当我去使用这个脚本替换 add key="SiteDomain" 值时:

$node = $WebConfigXml.configuration.location[3].appSettings.SelectSingleNode("add[@key = 'SiteDomain']")
$node.value = "someValue"
$WebConfigXml.Save($WebConfigFile)

这没用。在这种情况下,$node 值包含一个空字符串。

我也试图像这样读取节点:

$appSettingsSection = $WebConfigXml.configuration.location[3].appSettings;
$existingSiteDomain = $appSettingsSection.SelectSingleNode("add[@key='SiteDomain']")

而且我仍然得到 $existingSiteDomain 值的空字符串。

我已经使用 SelectSingleNode 查看了示例,但我似乎不太明白。不太确定我做错了什么。

谢谢,迈克

4

2 回答 2

24

您的 XML 文件有一个命名空间:

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

所以你需要一个命名空间管理器SelectSingleNode(参见“备注”部分):

XPath 表达式可以包含名称空间。使用XmlNamespaceManager支持命名空间解析。如果 XPath 表达式包含前缀,则必须将前缀和命名空间 URI 对添加到XmlNamespaceManager

像这样的东西应该工作:

$ns = New-Object System.Xml.XmlNamespaceManager($WebConfigXml.NameTable)
$ns.AddNamespace("ns", $WebConfigXml.DocumentElement.NamespaceURI)
$node = $WebConfigXml.SelectSingleNode("//ns:add[@key='SiteDomain']", $ns)
于 2013-09-18T20:17:57.790 回答
0

其他替代方法可以使用Select-Xml cmdlet:

$nameSpace = @{ x=$WebConfigXml.DocumentElement.NamespaceURI }    
$result = Select-Xml -Xml $WebConfigXml -XPath "//ns:add[@key='SiteDomain']" -Namespace $nameSpace
于 2021-03-13T07:05:45.697 回答