【问题标题】:Parsing XML from a stream, C# / SoapUI从流中解析 XML,C#/SoapUI
【发布时间】:2013-07-22 19:40:46
【问题描述】:

我正在尝试从使用 SoapUI 发送的以下 XML 片段中获取“有效负载”的值:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:loc="localhost">
   <soapenv:Header/>
   <soapenv:Body>
      <loc:HTTPWebService>
         <!--Optional:-->
         <loc:input>Test</loc:input>
         <payload>Data</payload>
      </loc:HTTPWebService>
   </soapenv:Body>
</soapenv:Envelope>

这是 C# 位:

string xmlPayload = "";

XmlDocument xmlSoapRequest = new XmlDocument();

using (Stream receiveStream = HttpContext.Current.Request.InputStream)
{
    receiveStream.Position = 0;

    using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8))
    { 
        xmlSoapRequest.Load(readStream);
        xmlPayload = xmlSoapRequest.SelectSingleNode("/payload/@value").Value;
    }
}
return xmlPayload;

问题是当前“xmlPayload”的值是 null 并且请求失败。 XML 已正确加载,但由于某种原因,“XmlPayload”为空,SoapUi 以“System.NullReferenceException:对象引用未设置为对象实例”作为响应。如何正确解析“payload”中的“Data”值?

【问题讨论】:

    标签: c# xml parsing soapui


    【解决方案1】:

    您选择的 "value" 属性值显然不存在于您的 XML 中。它也不在 DOM 的根目录。

    看起来像你想要的

      xmlPayload = xmlSoapRequest.SelectSingleNode("//payload").InnerText;
    

    (注意 "//" 表示“从根开始的任何节点”,缺少 "@value" 表示 - 名称为 "value" 的属性)

    【讨论】:

      【解决方案2】:

      Alexei 拥有它 - 除了使用“InnerText”而不是“Value”来获取您的“数据”:

      xmlPayload = xmlSoapRequest.SelectSingleNode("//payload").InnerText;
      

      【讨论】:

        【解决方案3】:

        如果节点为空,则需要在分配变量之前进行检查。

        试试这个:

        xmlPayload = xmlSoapRequest.SelectSingleNode("/payload/@value") != null ? xmlSoapRequest.SelectSingleNode("/payload/@value").Value : "value not available";
        

        但是,我相信更好的方法是使用 InnerText

        xmlPayload = xmlSoapRequest.GetElementByTagName("payload") != null ? xmlSoapRequest.GetElementByTagName("payload").InnerText : "value not available";
        

        格式是这样的:

        var variable = condition ? A : B;
        

        基本上就是说如果条件为true,则变量等于A,否则变量等于B。

        【讨论】:

          【解决方案4】:

          此代码运行良好,您应该能够将其重新合并到您的原始程序中:

          string xmlPayloadText = @"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:loc=""localhost"">
          <soapenv:Header/>
          <soapenv:Body>
              <loc:HTTPWebService>
                  <!--Optional:-->
                  <loc:input>Test</loc:input>
                  <payload>Data</payload>
              </loc:HTTPWebService>
          </soapenv:Body>
          </soapenv:Envelope>";
          
                  XmlDocument xmlSoapRequest = new XmlDocument();
                  xmlSoapRequest.LoadXml(xmlPayloadText);
                  var xmlPayload = xmlSoapRequest.SelectSingleNode("//payload");
                  Console.WriteLine(xmlPayload.InnerText);
          

          【讨论】:

            猜你喜欢
            • 2023-03-30
            • 1970-01-01
            • 2016-12-25
            • 2012-03-10
            • 1970-01-01
            • 2013-05-27
            • 2015-10-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多