1. ホーム
  2. powershell

[解決済み] xPath を使用する Powershell スクリプトの .SelectSingleNode が web.config ファイルから値を抽出する際に動作していない

2022-02-17 09:04:24

質問

では、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を使ったサンプルを見てみましたが、なかなか理解できません。何が間違っているのかよくわかりません。

ありがとうございます。 マイク

解決方法は?

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)