如何从 SOAP 响应中检索元素值

Posted

技术标签:

【中文标题】如何从 SOAP 响应中检索元素值【英文标题】:How to retrieve an element value from SOAP response 【发布时间】:2021-01-18 04:50:38 【问题描述】:

我有以下 SOAP 响应,我想从标记元素 a:Year1 中获取值。如何使用 c# 实现这一点?

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <GetPerformanceAndRiskByTypeCodeResponse xmlns="http://tempuri.org/">
      <GetPerformanceAndRiskByTypeCodeResult xmlns:a="http://schemas.datacontract.org/2004/07/FE.Toolkit.Services.DataContracts.ResponsiveChartingTool" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <IsSuccessful xmlns="http://schemas.datacontract.org/2004/07/FE.Toolkit.Services.DataContracts">false</IsSuccessful>
        <ResponseCode xmlns="http://schemas.datacontract.org/2004/07/FE.Toolkit.Services.DataContracts">0</ResponseCode>
        <ResponseMessage i:nil="true" xmlns="http://schemas.datacontract.org/2004/07/FE.Toolkit.Services.DataContracts" />
        <TotalRows xmlns="http://schemas.datacontract.org/2004/07/FE.Toolkit.Services.DataContracts">0</TotalRows>
        <a:CalendarPerformanceAs>2019-12-31T00:00:00</a:CalendarPerformanceAs>
        <a:CumulativePerformanceAs>2020-10-01T00:00:00</a:CumulativePerformanceAs>
        <a:DiscretePerformanceAs>2020-09-30T00:00:00</a:DiscretePerformanceAs>
        <a:InstrumentInformation>
          <a:InstrumentInformation>
            <a:CalendarPerformance>
              <a:IncomeBasisPriceType>2</a:IncomeBasisPriceType>
              <a:PerformanceCurrency>USD</a:PerformanceCurrency>
              <a:Year1>19.031154</a:Year1>
              <a:Year2>-13.434495</a:Year2>
              <a:Year3>23.004020</a:Year3>
              <a:Year4>-5.584117</a:Year4>
              <a:Year5>-2.882996</a:Year5>
            </a:CalendarPerformance>
          </a:InstrumentInformation>
        </a:InstrumentInformation>
        <a:RiskAs>2020-09-30T00:00:00</a:RiskAs>
      </GetPerformanceAndRiskByTypeCodeResult>
    </GetPerformanceAndRiskByTypeCodeResponse>
  </s:Body>
</s:Envelope>

我尝试了以下但没有运气:

var str = XElement.Parse(xml.Response.XmlResponse.ToString()); 
var result = str.Element("InstrumentInformation").Element("InstrumentInformation")[0].Element("CalendarPerformance").Element("Year1").Value; 
Console.WriteLine("RESULT" + result);

错误是

Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.

【问题讨论】:

您能否详细说明您的代码“不起作用”的原因?你期待什么,实际发生了什么?如果您遇到异常/错误,请发布它发生的行以及可以使用minimal reproducible example 完成的异常/错误详细信息。请edit您的问题将这些详细信息添加到其中,否则我们可能无法提供帮助。 A NullReferenceException 表示您正在访问的对象之一为空。例如,您的 Element() 调用之一返回 null 因为它没有找到任何内容,并且在该返回值上进一步调用 Element() 将是一个错误。 More details on NREs 看看这个问题是否能回答你的问题(注意你需要使用 XML 命名空间):***.com/questions/12201822/…(这是一个 dup 目标,但我已经 VtC'd) 【参考方案1】:

你需要处理元素的命名空间。您可以忽略它并使用本地名称,但包含它会更加健壮:

XNamespace ns = "http://schemas.datacontract.org/2004/07/FE.Toolkit.Services.DataContracts.ResponsiveChartingTool";

var y1 = str.Descendants().Elements(ns + "Year1").FirstOrDefault();

【讨论】:

感谢@Crowcoder 的回复,我得到了我需要的值。

以上是关于如何从 SOAP 响应中检索元素值的主要内容,如果未能解决你的问题,请参考以下文章

如何检查XML文件是否存在节点并在Progress4GL中检索值

如何从响应改造中检索 cookie,okhttp?

如何使用正则表达式规则从 json 数据响应中检索值?

c# - 从对象数组中检索一个值

如何从 input-tag 元素中检索文本值? [复制]

如何使用jQuery从数组中的元素中检索值?