【问题标题】:.Net Core - Use LINQ to XML to get element by name from SOAP response.Net Core - 使用 LINQ to XML 从 SOAP 响应中按名称获取元素
【发布时间】:2020-03-10 18:29:39
【问题描述】:

我发现了很多此类问题的例子,但由于某种原因,所有这些问题的答案都没有对我有用。

我得到的 SOAP 响应非常简单:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <GetDataAsStringResponse xmlns="http://tempuri.org/">
            <GetDataAsStringResult>true</GetDataAsStringResult>
        </GetDataAsStringResponse>
    </s:Body>
</s:Envelope>

这些是我为了解析它并获得“GetDataAsStringResult”元素而尝试过的所有选项:

var doc = XDocument.Parse(responseString);

XNamespace xmlns = "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"";
XNamespace nsTempuri = "xmlns=\"http://tempuri.org/\"";
var namespacePrefix = doc.Root.GetNamespaceOfPrefix("s");

var resultElement = doc.Descendants("GetDataAsStringResult"); //yields no results
var resultElement1 = doc.Descendants(nsTempuri + "GetDataAsStringResult"); //yields no results
var resultElement2 = doc.Descendants(xmlns + "GetDataAsStringResult"); //yields no results
var resultElement3 = doc.Descendants(namespacePrefix + "GetDataAsStringResult"); //yields no results


var resultElement4 = doc.Descendants(namespacePrefix + "Body"); //Gets s:Body element with descendants

var resultElement5 = resultElement3.Descendants("GetDataAsStringResponse");  //yields no results
var resultElement6 = resultElement3.Descendants(nsTempuri + "GetDataAsStringResponse");  //yields no results
var resultElement7 = resultElement3.Descendants(namespacePrefix + "GetDataAsStringResponse");  //yields no results

var resultElement8 = resultElement4.Descendants(); //Gets IEnumerable with both GetDataAsStringResponse and GetDataAsStringResult

基于所有这些实验,我可以执行以下操作:

var doc = XDocument.Parse(responseString);
var namespacePrefix = doc.Root.GetNamespaceOfPrefix("s");

var dataAsStringResult = from data in doc.Descendants(namespacePrefix + "Body")
                           let descendats = data.Descendants()
                           select descendats.TakeLast(1).Single();

这看起来需要太多的步骤才能得到我需要的东西,尤其是根据 SO 中的一些答案,我应该能够以更简单的方式完成它。

任何关于为什么我无法通过使用“后代”方法直接访问 GetDataAsStringResult 的见解,即使添加命名空间也是如此。

谢谢。

【问题讨论】:

  • 字符串值 = (string)doc.Descendents().Where(x => x.Name.LocalName == "GetDataAsStringResponse").FirstOrDefault()

标签: c# linq-to-xml


【解决方案1】:

经过几个小时的疯狂,结果证明这是一个“你错过了分号”的问题。命名空间对象的声明应不带 "xlmns=" 部分,如下所示:

XNamespace nsTempuri = "http://tempuri.org/";

通过这样做,然后以下工作:

doc.Descendants(nsTempuri + "GetDataAsStringResult");

【讨论】:

    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2016-07-26
    相关资源
    最近更新 更多