.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
Другие вопросы по тегам