2013-09-18 3 views
5

Итак, вот фрагмент из моего файла web.config:.SelectSingleNode в Powershell скрипт с помощью XPath не работает на извлечение значения из файла 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 } 

Но когда я иду, чтобы заменить добавить ключ = значение «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, и я не могу понять, как это понять. Не слишком уверен, что я делаю неправильно.

Спасибо, Майк

ответ

16

Ваш файл 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) 
+0

Хорошо, я попробовал это, но теперь я получаю сообщение об ошибке от Powershell. Он не знает, что XmlNamespaceManager: «XmlNamespaceManager: термин« XmlNamespaceManager »не распознается как имя командлета, функции, файла сценария или исполняемой программы. Проверьте правильность написания имени или если путь был включен, проверьте что путь правильный и повторите попытку. ". Я запускал «$ psversiontable.psversion» в командной строке powershell, и он говорит, что у меня установлена ​​версия Powershell версии 3.0. Это какой-то тип проблемы с версией? –

+1

Хорошо, я исправляю свой предыдущий комментарий. Сейчас он работает. Я думаю, что в моем скрипте была иная проблема синтаксиса, которая вызывала эту ошибку. Код, который вы предоставили, работал! Спасибо. Я новичок в Powershell и xPath, поэтому я понятия не имел об этой проблеме с пространством имен. –

 Смежные вопросы

  • Нет связанных вопросов^_^