0

我正在尝试从使用 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:未设置对象实例的对象引用”进行响应。如何正确解析“有效负载”中的“数据”值?

4

4 回答 4

3

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

看起来你想要

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

(注意"//"它的意思是“从根开始的任何节点”并且缺少"@value"它的意思 - 带有名称的属性"value"

于 2013-07-22T19:47:25.993 回答
1

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

xmlPayload = xmlSoapRequest.SelectSingleNode("//payload").InnerText;
于 2013-07-22T19:58:12.160 回答
0

此代码工作正常,您应该能够将其重新合并到您的原始程序中:

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);
于 2013-07-22T19:53:49.313 回答
0

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

尝试这个:

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。

于 2013-07-22T19:46:15.433 回答