我想从SOAP消息中提取SOAP体,我在SOAP体中有一些数据,我必须在日期库中解析,所以这是代码:
public string Load_XML(string SoapMessage) { //check soap message if (SoapMessage == null || SoapMessage.Length <= 0) throw new Exception("Soap message not valid"); //declare some local variable int iSoapBodyStartIndex = 0; int iSoapBodyEndIndex = 0; //load the Soap Message //Učitaj string XML-a i pretvori ga u XML XmlDocument doc = new XmlDocument(); try { doc.Load(SoapMessage); } catch (XmlException ex) { WriteErrors.WriteToLogFile("WS.LOAD_DOK_LoadXML",ex.ToString()); throw ex; } //search for the "http://schemas.xmlsoap.org/soap/envelope/" URI prefix string prefix = string.Empty; for (int i = 0; i < doc.ChildNodes.Count; i++) { System.Xml.XmlNode soapNode = doc.ChildNodes[i]; prefix = soapNode.GetPrefixOfNamespace("http://schemas.xmlsoap.org /soap/envelope/"); if (prefix != null && prefix.Length > 0) break; } //prefix not founded. if (prefix == null || prefix.Length <= 0) throw new Exception("Can't found the soap envelope prefix"); //find soap body start index int iSoapBodyElementStartFrom = SoapMessage.IndexOf("<" + prefix + ":Body"); int iSoapBodyElementStartEnd = SoapMessage.IndexOf(">",iSoapBodyElementStartFrom); -> HERE I HAVE AN ERROR!!!! iSoapBodyStartIndex = iSoapBodyElementStartEnd + 1; //find soap body end index iSoapBodyEndIndex = SoapMessage.IndexOf("</" + prefix + ":Body>") - 1; //get soap body (xml data) return SoapMessage.Substring(iSoapBodyStartIndex,iSoapBodyEndIndex - iSoapBodyStartIndex + 1); }
我在这里有一个错误:
int iSoapBodyElementStartEnd = SoapMessage.IndexOf(">",iSoapBodyElementStartFrom);
错误:
Index was out of range. Must be non-negative and less than the size of
the collection.
如果有人知道如何解决这个问题?
解决方法
对于这样的请求:
String request = @"<?xml version=""1.0"" encoding=""UTF-8""?> <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:soapenc=""http://schemas.xmlsoap.org/soap/encoding/"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> <soap:Body> <ResponseData xmlns=""urn:Custom"">some data</ResponseData> </soap:Body> </soap:Envelope>";
以下代码完成了打开数据的工作,只得到< ReponseData> xml内容:
XDocument xDoc = XDocument.Load(new StringReader(request)); var unwrappedResponse = xDoc.Descendants((XNamespace)"http://schemas.xmlsoap.org/soap/envelope/" + "Body") .First() .FirstNode