我通过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>
&lt;SelectDef&gt; &lt;Id&gt;1736&lt;/Id&gt; &lt;SelectName&gt;Values List&lt;/SelectName&gt; &lt;GlobalFlag&gt;False&lt;/GlobalFlag&gt; &lt;Sort&gt;1&lt;/Sort&gt; &lt;SelectDefValues&gt; &lt;SelectDefValue&gt; &lt;guid&gt;aaf6f3a7-6a74-4187-b4e7-3a9355b16796&lt;/guid&gt; &lt;Id&gt;14692&lt;/Id&gt; &lt;Name&gt;Open&lt;/Name&gt; &lt;Description&gt;&lt;/Description&gt; &lt;Color&gt;#000000&lt;/Color&gt; &lt;DefaultFlag&gt;False&lt;/DefaultFlag&gt; &lt;SortOrder&gt;1&lt;/SortOrder&gt; &lt;select_id&gt;1736&lt;/select_id&gt; &lt;/SelectDefValue&gt; &lt;SelectDefValue&gt; &lt;guid&gt;f5082b54-d799-4fdc-80c1-0e232b360057&lt;/guid&gt; &lt;Id&gt;14693&lt;/Id&gt; &lt;Name&gt;Closed&lt;/Name&gt; &lt;Description&gt;&lt;/Description&gt; &lt;Color&gt;#000000&lt;/Color&gt; &lt;DefaultFlag&gt;False&lt;/DefaultFlag&gt; &lt;SortOrder&gt;0&lt;/SortOrder&gt; &lt;select_id&gt;1736&lt;/select_id&gt; &lt;/SelectDefValue&gt; &lt;SelectDefValue&gt; &lt;guid&gt;94e29e78-2ab3-463f-bbb6-ab7f36003c7f&lt;/guid&gt; &lt;Id&gt;14780&lt;/Id&gt; &lt;Name&gt;Past Due&lt;/Name&gt; &lt;Description&gt;&lt;/Description&gt; &lt;Color&gt;#000000&lt;/Color&gt; &lt;DefaultFlag&gt;False&lt;/DefaultFlag&gt; &lt;SortOrder&gt;2&lt;/SortOrder&gt; &lt;select_id&gt;1736&lt;/select_id&gt; &lt;/SelectDefValue&gt; &lt;/SelectDefValues&gt; &lt;/SelectDef&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);
答案 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”可以帮助您生成代理并避免上述所有代码。