2013-01-15 64 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