.SelectSingleNode в скрипте Powershell с использованием xPath не работает при извлечении значений из файла web.config
Итак, вот фрагмент моего файла 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>
Я пытаюсь найти узел, использующий xPath через Powershell. Несколько замечаний по поводу этого 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']")
И я все еще получаю пустую строку для значения $ существующего SiteDomain.
Я посмотрел на образцы, используя SelectSingleNode, и я не могу понять это. Не слишком уверен, что я делаю не так.
Спасибо майк
2 ответа
Ваш 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)
Другой альтернативой может быть использование командлета Select-Xml :
$nameSpace = @{ x=$WebConfigXml.DocumentElement.NamespaceURI }
$result = Select-Xml -Xml $WebConfigXml -XPath "//ns:add[@key='SiteDomain']" -Namespace $nameSpace