2013-01-15 37 views
0

我通过SOAP调用获得以下XML。将编码的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); 

回答

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> 

你可能不希望另类

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

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

MSDN主题“How to add a Reference to a Web Service”应该可以帮助您生成代理并避免上述所有代码。

+0

感谢破折号,你的代码像一个魅力工作。我会用一个引用,但我需要保持所有的代码内联;没有代码背后。 – primortal