XML Soap从Xelement获取元素

时间:2016-01-26 15:31:43

标签: c# xml soap

我通过响应流获取的xml:

<?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>

该代码用于尝试获取&#34; generateSSOResponse&#34;令牌值。

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");
  

错误:需要命名空间管理器或XsltContext。这个查询有一个   前缀,变量或用户定义的函数。

说我需要命名空间管理器?我虽然处理XMLdoc而不是xElement时呢?这是什么解决方案?

编辑:变量&#34; s&#34;响应流代码为:

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

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

2 个答案:

答案 0 :(得分:1)

老实说,使用LINQ to XML要简单得多:

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

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

有关工作示例,请参阅this fiddle。如果你确实想使用XPath,那么你需要一个命名空间管理器来允许XPath导航器解析你表达式中的所有前缀。

另外,您还可以直接从流中解析XML:

var doc = XDocument.Load(rstream);

答案 1 :(得分:0)

好的,所以Charles Mager在尝试使用Xelement时使用XMLtoLINQ给出了答案。然而事实证明,嵌入代码的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);

希望这可以帮助那些和我一样陷入困境的人。