簡體   English   中英

.Net Core - 使用 LINQ to XML 從 SOAP 響應中按名稱獲取元素

[英].Net Core - Use LINQ to XML to get element by name from SOAP response

我發現很多此類問題的例子,但由於某種原因,所有這些問題的答案都沒有對我有用。

我得到的 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 的見解將不勝感激。

謝謝你。

經過幾個小時的瘋狂后,結果證明是“您錯過了分號”問題。 命名空間對象應該在沒有“xlmns=”部分的情況下聲明,如下所示:

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

通過這樣做,然后以下工作:

doc.Descendants(nsTempuri + "GetDataAsStringResult");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM