2016-01-26 72 views
2

,我通過響應流中獲取XML:XML SOAP獲取元素從的XElement

<?xml version="1.0" encoding="utf-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
     <generateSSOResponse xmlns="http://url.com"> 
      <generateSSOReturn>2DKtjZNq58THggh42lNsGvgGTjF8RSBA</generateSSOReturn> 
     </generateSSOResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

的代碼使用嘗試並獲得了「generateSSOResponse」令牌值。

var xmlDoc = XElement.Parse(s); 

var ssoToken = xmlDoc.XPathSelectElement("/soapenv:Envelope[@xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"]/soapenv:Body/generateSSOResponse[@xmlns=\"http://ws.configureone.com\"]/generateSSOReturn"); 

Error: Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.

說我需要一個命名空間管理?我雖然那是在處理XMLdoc而不是xElement?這裏有什麼解決方案?

編輯:變量 「s」 是響應流代碼:

using (var mem = new MemoryStream()) 
{ 
    rstream.CopyTo(mem); 

    var b = mem.ToArray(); 
    var s = System.Text.Encoding.UTF8.GetString(b); 

回答

0

好了,所以查爾斯馬傑給使用XMLtoLINQ我試圖用的XElement的答案。然而事實證明,代碼嵌入到的ERP不支持linq(bummer)。

所以這裏的解決方案,我得到了工作,而不XMLtoLINQ:

XmlDocument mydoc = new XmlDocument(); 
    XmlNamespaceManager manager = new XmlNamespaceManager(mydoc.NameTable); 
    manager.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope/"); 
    manager.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema"); 
    manager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
    manager.AddNamespace("rsp","http://url.com"); 


    mydoc.LoadXml(s); 
    var mytoken = mydoc.SelectSingleNode("//rsp:generateSSOReturn", manager); 

希望這有助於別人誰是同樣的困境,因爲我是。

1

老實說,這將會是簡單得多的使用LINQ到XML作爲它的目的是:

XNamespace ns = "http://url.com"; 

var token = (string)doc.Descendants(ns + "generateSSOReturn").Single(); 

this fiddle爲一個工作示例。如果您確實想要使用XPath,那麼是的,您需要一個名稱空間管理器來允許XPath導航器解析表達式中的所有前綴。

順便說一句,你還可以分析XML從流直接:

var doc = XDocument.Load(rstream); 
+0

謝謝你,我嘗試了一些變化,並得到它在linqpad工作沒有問題.....但是代碼去的地方是沒有XMLtoLinq的地方:(哦,哦,病得必須找到另一條路線 – lemunk