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 に答える