将编码的XML标记转换为节点

时间:2013-01-15 16:00:33

标签: c# xml soap

我通过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#,如果下面是一个完全混乱我的appologies。

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);

1 个答案:

答案 0 :(得分:0)

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

使用您的消息和.Net 4进行测试。

假设vls将您的SOAP消息包含为XML,我们将问题分成两半;解析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;

第二部分 - 将编码后的字符串转换为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主题“How to add a Reference to a Web Service”可以帮助您生成代理并避免上述所有代码。