我通过响应流获取的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);
答案 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);
希望这可以帮助那些和我一样陷入困境的人。