0

我通过 SOAP 调用获得了以下 XML。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
    <GetValueListForFieldResponse xmlns="http://URLHere/webservices/">
        <GetValueListForFieldResult>
            &amp;lt;SelectDef&amp;gt; &amp;lt;Id&amp;gt;1736&amp;lt;/Id&amp;gt; &amp;lt;SelectName&amp;gt;Values List&amp;lt;/SelectName&amp;gt; &amp;lt;GlobalFlag&amp;gt;False&amp;lt;/GlobalFlag&amp;gt; &amp;lt;Sort&amp;gt;1&amp;lt;/Sort&amp;gt; &amp;lt;SelectDefValues&amp;gt; &amp;lt;SelectDefValue&amp;gt; &amp;lt;guid&amp;gt;aaf6f3a7-6a74-4187-b4e7-3a9355b16796&amp;lt;/guid&amp;gt; &amp;lt;Id&amp;gt;14692&amp;lt;/Id&amp;gt; &amp;lt;Name&amp;gt;Open&amp;lt;/Name&amp;gt; &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt; &amp;lt;Color&amp;gt;#000000&amp;lt;/Color&amp;gt; &amp;lt;DefaultFlag&amp;gt;False&amp;lt;/DefaultFlag&amp;gt; &amp;lt;SortOrder&amp;gt;1&amp;lt;/SortOrder&amp;gt; &amp;lt;select_id&amp;gt;1736&amp;lt;/select_id&amp;gt; &amp;lt;/SelectDefValue&amp;gt; &amp;lt;SelectDefValue&amp;gt; &amp;lt;guid&amp;gt;f5082b54-d799-4fdc-80c1-0e232b360057&amp;lt;/guid&amp;gt; &amp;lt;Id&amp;gt;14693&amp;lt;/Id&amp;gt; &amp;lt;Name&amp;gt;Closed&amp;lt;/Name&amp;gt; &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt; &amp;lt;Color&amp;gt;#000000&amp;lt;/Color&amp;gt; &amp;lt;DefaultFlag&amp;gt;False&amp;lt;/DefaultFlag&amp;gt; &amp;lt;SortOrder&amp;gt;0&amp;lt;/SortOrder&amp;gt; &amp;lt;select_id&amp;gt;1736&amp;lt;/select_id&amp;gt; &amp;lt;/SelectDefValue&amp;gt; &amp;lt;SelectDefValue&amp;gt; &amp;lt;guid&amp;gt;94e29e78-2ab3-463f-bbb6-ab7f36003c7f&amp;lt;/guid&amp;gt; &amp;lt;Id&amp;gt;14780&amp;lt;/Id&amp;gt; &amp;lt;Name&amp;gt;Past Due&amp;lt;/Name&amp;gt; &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt; &amp;lt;Color&amp;gt;#000000&amp;lt;/Color&amp;gt; &amp;lt;DefaultFlag&amp;gt;False&amp;lt;/DefaultFlag&amp;gt; &amp;lt;SortOrder&amp;gt;2&amp;lt;/SortOrder&amp;gt; &amp;lt;select_id&amp;gt;1736&amp;lt;/select_id&amp;gt; &amp;lt;/SelectDefValue&amp;gt; &amp;lt;/SelectDefValues&amp;gt; &amp;lt;/SelectDef&amp;gt;
        </GetValueListForFieldResult>
    </GetValueListForFieldResponse>
</soap:Body>

有没有办法将 GetValueForFieldResult 节点中的数据转换为实际的 XML,以便我可以解析数据?

下面是我如何进行 SOAP 调用和存储 XML。我正在学习 C#,如果下面是一团糟,我的道歉。

HttpWebRequest reqVl = (HttpWebRequest)WebRequest.Create(serverURL + "/ws/Field.asmx");
reqVl.Headers.Add("SOAPAction", "http://URL/webservices/GetValueListForField");
reqVl.ContentType = "text/xml;charset=\"utf-8\"";
reqVl.Accept = "text/xml";
reqVl.Method = "POST";

using (Stream stm = reqVl.GetRequestStream())
{
    using (StreamWriter stmw = new StreamWriter(stm))
    {
        stmw.Write(VLsoap);
    }
}

WebResponse responseVL = reqVl.GetResponse();
Stream responseStreamVL = responseVL.GetResponseStream();
XmlReader rdrVL = XmlReader.Create(responseStreamVL);

XmlDocument vls = new XmlDocument();
vls.Load(rdrVL);
4

1 回答 1

0

这是一些实现您想要的代码 - 但是,请稍后阅读文本以解释为什么这可能不是获得您想要的最佳方式。

经测试可与您的消息和 .Net 4 一起使用。

假设 vls 包含您作为 XML 的 SOAP 消息,我们将问题分成两半;解析soap消息,并将GetValueListForFieldResult节点的内容提取和解码为可以加载到另一个的字符串XmlDocument

第一部分- 获取GetValueListForFieldResult节点的内容

  XmlNamespaceManager namespaceManager = new XmlNamespaceManager(vls.NameTable);
  namespaceManager.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
  namespaceManager.AddNamespace("default", "http://URLHere/webservices/");

  XmlNode payLoadNode =
    vls.SelectSingleNode("/soap:Envelope/soap:Body/default:GetValueListForFieldResponse/default:GetValueListForFieldResult", namespaceManager);

  string encodedXml = payLoadNode.InnerText;

第 II 部分- 将编码字符串放入 Xml 文档

正是在这一点上,我们有了编码的字符串。我们有几个选择来解码这个 HTML;当我使用.Net 4时,我选择了最简单的:

  string decodedXml = WebUtility.HtmlDecode(encodedXml);

  XmlDocument payloadDocument = new XmlDocument();
  payloadDocument.LoadXml(decodedXml);

如果您使用的是 .Net 3.5,那么您将不得不考虑添加对 System.Web 的引用并使用它HttpUtility.HtmlDecode来解码字符串。

解析上面的消息给了我结果:

<SelectDef>
  <Id>1736</Id>
  <SelectName>Values List</SelectName>
  <GlobalFlag>False</GlobalFlag>
  <Sort>1</Sort>
  <SelectDefValues>
    <SelectDefValue>
      <guid>aaf6f3a7-6a74-4187-b4e7-3a9355b16796</guid>
      <Id>14692</Id>
      <Name>Open</Name>
      <Description></Description>
      <Color>#000000</Color>
      <DefaultFlag>False</DefaultFlag>
      <SortOrder>1</SortOrder>
      <select_id>1736</select_id>
    </SelectDefValue>
    <SelectDefValue>
      <guid>f5082b54-d799-4fdc-80c1-0e232b360057</guid>
      <Id>14693</Id>
      <Name>Closed</Name>
      <Description></Description>
      <Color>#000000</Color>
      <DefaultFlag>False</DefaultFlag>
      <SortOrder>0</SortOrder>
      <select_id>1736</select_id>
    </SelectDefValue>
    <SelectDefValue>
      <guid>94e29e78-2ab3-463f-bbb6-ab7f36003c7f</guid>
      <Id>14780</Id>
      <Name>Past Due</Name>
      <Description></Description>
      <Color>#000000</Color>
      <DefaultFlag>False</DefaultFlag>
      <SortOrder>2</SortOrder>
      <select_id>1736</select_id>
    </SelectDefValue>
  </SelectDefValues>
</SelectDef>

替代方案

您可能不希望这样做的原因是您收到的响应已使用 SOAP 进行了包装;因此,您可能希望尝试将您连接的服务作为 Web 服务使用并生成代理库;这会将您在上面看到的所有代码以及您编写的代码封装在一个代理中,该代理可能允许您以更安全和更不脆弱的方式检索您想要的值。.Net 中内置了对此的支持。

此外,由于您要连接的 URL 在 ASMX 中终止,它会告诉您这很可能是本机 .Net Web 服务,因此将您的客户端连接到它应该很简单。

MSDN 主题“如何添加对 Web 服务的引用”应该可以帮助您生成代理并避免使用上述所有代码。

于 2013-01-15T16:52:26.410 回答