XML Soap Get Element From Xelement
本文关键字:From Xelement Element Get Soap XML | 更新日期: 2023-09-27 18:32:08
我通过响应流获得的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>
该代码用于尝试获取"生成SSOResponse"令牌值。
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的时候? 这里的解决方案是什么?
编辑:变量"s"是响应流代码,如下所示:
using (var mem = new MemoryStream())
{
rstream.CopyTo(mem);
var b = mem.ToArray();
var s = System.Text.Encoding.UTF8.GetString(b);
老实说,按照预期使用 LINQ to XML 要简单得多:
XNamespace ns = "http://url.com";
var token = (string)doc.Descendants(ns + "generateSSOReturn").Single();
有关工作示例,请参阅此小提琴。 如果您确实想使用 XPath,那么是的,您需要一个命名空间管理器来允许 XPath 导航器解析表达式中的所有前缀。
顺便说一句,您也可以直接从流中解析 XML:
var doc = XDocument.Load(rstream);
好的,
所以Charles Mager在我尝试使用Xelement时使用XMLtoLINQ给出了答案。 然而,事实证明,嵌入代码的ERP不支持linq(无赖)。
因此,这是我在没有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);
希望这能帮助任何和我处于同样困境的人。