2016-05-09 5 views
1

У меня есть некоторые XML:PowerShell, XML и пространства имен

<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP:Body> 
    <P2MessageServiceStatus> 
     <CONNECTION>CONNECTION_CONNECTED</CONNECTION> 
     <ROUTER>ROUTER_CONNECTED</ROUTER> 
    </P2MessageServiceStatus> 
    </SOAP:Body> 
</SOAP:Envelope> 

не может справиться с ним из-за пространства имен. Пытается много, но не работает.

[string]$xpath = '/SOAP:Envelope/SOAP:Body/P2MessageServiceStatus/@CONNECTION' 

$wc = New-Object Net.WebClient 
[xml]$stuff = $wc.DownloadString($url) 

$ns = New-Object Xml.XmlNamespaceManager $stuff.NameTable 
$ns.AddNamespace("SOAP", $xmlns) 

$xmlvalue = $stuff.SelectSingleNode($xpath, $ns) 

Ошибка - потребность менеджера пространств имен или XsltContext

Если

$xmlvalue = $stuff.SelectSingleNode($xpath,'SOAP') 

Ошибка - Не удалось найти перегрузки для "SelectSingleNode"

Как заставить этот запрос xpath работать с пространствами имен?

ответ

2

Я не вижу ваш $xmlns. Это работает:

[string]$xpath='/SOAP:Envelope/SOAP:Body/P2MessageServiceStatus/CONNECTION' 

$namespaceMgr = New-Object System.Xml.XmlNamespaceManager $stuff.NameTable 
$namespace = $stuff.DocumentElement.NamespaceURI 
$namespaceMgr.AddNamespace("SOAP", $namespace) 


$stuff.SelectSingleNode($xpath,$ns) 

Примечание: Вы можете также доступ на узлы, такие как свойства с PowerShell:

$stuff.DocumentElement.Body.P2MessageServiceStatus.CONNECTION 
+0

, если я использую $ stuff.SelectSingleNode ($ XPath, $ имен) его не работает вообще. Если $ stuff.SelectSingleNode ($ xpath, $ namespaceMgr), он возвращает значение, но также я получил исключение «can not find reload для SelectSingleNode и 2 метода ...» ... это нормально? –

+0

omg я получил это исключение на рабочем компьютере, но не на моем сервере ... он работает..от вас много –

+0

, если я вижу переменную $ namespaceMgr, я увижу 3 из них - xmlns, xml, SOAP. может ли это быть причиной ошибок? –

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