2016-05-13 2 views
0

У меня есть следующий XML:Выберите узлы XML из пространства имен с помощью Powershell

<?xml version="1.0" encoding="utf-8"?> 
<userSettings> 
    <setting name="TelephonyServerHost"> 
    <value>sipserver.domain.local</value> 
    </setting> 
    <setting name="SipServerFqdn"> 
    <value>sipserver.domain.local</value> 
    </setting> 
    <setting name="WebServicesHost"> 
    <value>websvc.domain.local</value> 
    </setting> 
    <setting name="KMSettings"> 
    <value> 
     <KMIndexSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <AutoIndexEnabled>false</AutoIndexEnabled> 
    </KMIndexSettings> 
    </value> 
    </setting> 
</userSettings> 

Я могу получить значение установочных элементов с помощью XPath, но я не могу понять правильный синтаксис для запроса элемента AutoIndexEnabled используя пространство имен.

Это работает, как ожидалось для чтения KMSettings или другие узлы, которые не имеют имен:

$xml = New-Object -TypeName 'System.XML.XMLDocument' 
$xml.Load($xmlFilePath) 
$node = $xml.SelectSingleNode("//userSettings/setting[@name='KMSettings']") 

Но я не могу понять синтаксис, как запросить элемент AutoIndexEnabled.

+0

Я не пользователь PowerShell, так что не будет в состоянии помочь с PowerShell специфический синтаксис, но в терминах xml элемент AutoIndexEnabled находится в пространстве имен xsi, поэтому вы должны использовать возможности PowerShell для доступа к пространству имен, а затем к узлам в этом пространстве имен. Выполнение быстрого поиска Я нашел [этот ответ] (http://stackoverflow.com/questions/25566269/select-an-attribute-with-xpath-in-a-xml-with-namespace-using-powershell), который похоже, соответствует вашей проблеме –

ответ

1

Я не понимаю эту проблему. Пространства имен здесь не имеют значения, потому что ваш xml-образец не содержит префиксные элементы или пространство имен по умолчанию. Вы можете получить доступ к элементу как это:

$xml.SelectNodes("//AutoIndexEnabled") 

или

$xml.SelectNodes("//setting[@name='KMSettings']//AutoIndexEnabled") 

Выход:

#text 
----- 
false 

PS> $xml.SelectNodes("//AutoIndexEnabled").InnerText 
false 
+0

Спасибо. Я запутался в синтаксисе xpath. – kr0me

0

В PowerShell можно получить доступ к XML-узлов, таких как свойства, так что это работает:

($xml.DocumentElement.setting | ? name -eq 'KMSettings').value.KMIndexSettings.AutoIndexEnabled 

А вот работает XPATH решение:

[string]$xpath="//userSettings/setting[@name='KMSettings']/value/KMIndexSettings/AutoIndexEnabled"  
$xml.SelectSingleNode($xpath) 
+0

Изменилась ли смена образца? Я не вижу SOAP-пространства имен, и вы даже не используете его в своем xpath ..: S –

+1

Упс, вы правы @FrodeF. Я только что скопировал решение из предыдущего ответа. Спасибо за подсказку! –

+0

Спасибо, ваш xpath помог. – kr0me

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