【问题标题】:Unable to get values from soap response using c#无法使用c#从soap响应中获取值
【发布时间】:2019-03-31 11:55:42
【问题描述】:

我的肥皂反应在下面很安静。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:doCommandResponse xmlns:ns2="http://soap.inf.hexing.cn">    <return>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;ResponseMessage xmlns=&quot;http://iec.ch/TC57/2011/schema/message&quot; xmlns:m=&quot;http://iec.ch/TC57/2011/MeterReadings#&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://iec.ch/TC57/2011/schema/message Message.xsd&quot;&gt;
 &lt;Header&gt;
   &lt;Verb&gt;created&lt;/Verb&gt;
    &lt;Noun&gt;MeterReadings&lt;/Noun&gt;
   &lt;Timestamp&gt;2019-03-31T15:54:12+04:30&lt;/Timestamp&gt;
  &lt;Source&gt;HES_BASE&lt;/Source&gt;
 &lt;AsyncReplyFlag&gt;true&lt;/AsyncReplyFlag&gt;
&lt;ReplyAddress&gt;http://192.168.15.2:8090/HES/services/DoCommandRequest?wsdl&lt;/ReplyAddress&gt;
&lt;AckRequired&gt;true&lt;/AckRequired&gt;
  &lt;User&gt;
     &lt;UserID&gt;abc&lt;/UserID&gt;
  &lt;/User&gt;
&lt;Property&gt;
  &lt;Name&gt;password&lt;/Name&gt;
    &lt;Value&gt;2222&lt;/Value&gt;
 &lt;/Property&gt;
 &lt;MessageID&gt;2AB290AE-5DBC-414D-8C5D-70836514E736&lt;/MessageID&gt;
 &lt;CorrelationID&gt;String&lt;/CorrelationID&gt;
&lt;/Header&gt;
&lt;Reply&gt;
&lt;Result&gt;OK&lt;/Result&gt;
&lt;Error&gt;
&lt;code&gt;0.0&lt;/code&gt;
&lt;/Error&gt;
&lt;/Reply&gt;
&lt;Payload&gt;
&lt;m:MeterReadings&gt;
&lt;m:MeterReading&gt;
&lt;m:valuesInterval&gt;
 &lt;m:end&gt;2019-03-31T00:00:00+04:30&lt;/m:end&gt;
 &lt;m:start&gt;2019-03-01T00:00:00+04:30&lt;/m:start&gt;
 &lt;/m:valuesInterval&gt;
 &lt;m:Meter&gt;
  &lt;m:Names&gt;
        &lt;m:name&gt;37030298060&lt;/m:name&gt;
     &lt;m:NameType&gt;
       &lt;m:name&gt;28373341367200U&lt;/m:name&gt;
    &lt;/m:NameType&gt;
  &lt;/m:Names&gt;
  &lt;m:mRID&gt;002997004330&lt;/m:mRID&gt;
  &lt;/m:Meter&gt;
  &lt;m:Readings&gt;
  &lt;m:ReadingType ref=&quot;13.8.0.6.1.1.12.0.0.0.0.0.0.0.224.3.38.0&quot;/&gt;
  &lt;m:ReadingQualities&gt;
   &lt;m:ReadingQualityType ref=&quot;2.5.259&quot;/&gt;
 &lt;/m:ReadingQualities&gt;
&lt;m:timePeriod&gt;
   &lt;m:end&gt;2019-03-31T00:00:00+04:30&lt;/m:end&gt;
   &lt;m:start&gt;2019-03-01T00:00:00+04:30&lt;/m:start&gt;
&lt;/m:timePeriod&gt;
&lt;m:value&gt;55.588&lt;/m:value&gt;
&lt;m:timeStamp&gt;2019-03-21T00:00:00+04:30&lt;/m:timeStamp&gt;
&lt;/m:Readings&gt;
&lt;/m:MeterReading&gt;
&lt;m:Reading/&gt;
&lt;/m:MeterReadings&gt;
&lt;/Payload&gt;
&lt;/ResponseMessage&gt;
</return></ns2:doCommandResponse></soap:Body></soap:Envelope>

从上面的回复中,我想从上面的回复中获取一些数据。下面是我的代码

 if (dt != null && dt.Rows.Count > 0)
        {
            totalRec = dt.Rows.Count;
            timer.Start();
            foreach (DataRow dr in dt.Rows)
            {

                var _url = "http://111.111.111.1:8090/HES/services/DoCommandRequest";

                string uniqueID = dr["Application_No"].ToString();
                //string meterNo = dr["METER_SERIAL_NO"].ToString();

                XmlDocument soapEnvelopeXml = CreateSoapEnvelope(uniqueID);
                HttpWebRequest webRequest = CreateWebRequest(_url);
                InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);


                // begin async call to web request.
                IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);

                // suspend this thread until call is complete. You might want to
                // do something usefull here like update your UI.
                asyncResult.AsyncWaitHandle.WaitOne();

                // get the response from the completed web request.
                string soapResult;
                using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
                {
                    using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
                    {
                        soapResult = rd.ReadToEnd();
                        processedRec++;


                    }

                }

            }
            timer.Stop();
        }

在上面的代码中,响应在字符串soapResult 中。

为了从响应中获取值,我尝试执行以下操作

XDocument doc = XDocument.Parse(soapResult);
XmlReader xr = doc.CreateReader();
xr.ReadToFollowing("UserID");
string uid = xr.ReadElementContentAsString();

但我得到了错误

{“节点类型None不支持ReadElementContentAsString方法。第0行,位置0。”}

这个我也试过了

var result = from p in doc.Descendants() 
         where p.Name.LocalName == "UserID" select p.Value;

但它没有给我任何结果。

任何帮助将不胜感激

【问题讨论】:

  • SOAP 响应似乎包含一个字符串,如果将其解码为来自 SOAP 响应的值,则它本身可以被解析为 XML。 (当基于尖括号的标记作为字符串值添加到 HTML 或 XML 时,将对其内容进行编码以将其内容保留为字符串值。)
  • 即。获取 &lt;return&gt; 元素的值并将其传递给 XML 解析器以从中提取信息。
  • @Richard 所以我只需要执行以下操作XDocument doc = XDocument.Parse(soapResult); ?
  • 您需要从doc 中获取&lt;result&gt; 元素的内容并对其进行解析(您已将XML 编码为XML 中的字符串)。
  • Richard 是正确的,无论是谁编写了该服务作为soap 调用的结果返回一个xml 文档,id 创建一个代理来执行soap 调用,然后尝试解析 中的 xml这将是代理类 codeproject.com/Articles/786601/… 上的字符串属性

标签: c# soap


【解决方案1】:

首先将&lt;return&gt; 元素的值放入一个字符串变量中(比如说string returnValue

然后通过将值传递给以下函数,使用 XML 解码 returnValue

public static string XmlDecode(string value) {
    var xmlDoc = new XmlDocument();
    xmlDoc.LoadXml("<root>" + value + "</root>");
    return xmlDoc.InnerText;
}

上述函数的返回值是有效的 XML,您可以使用 XDocument.Parse 或 LINQ to XML 进行解析

【讨论】:

    【解决方案2】:

    问题是您的肥皂响应内容是 XML。但是 xml 元素的 UserID 被理解为一个字符串——在你的响应内容中,有很多 html 转义字符)。

    您需要通过替换 &amp;lt;&amp;gt;&amp;quot; 来修复您的服务或取消转义字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-03
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      相关资源
      最近更新 更多