.NET Core中如何将SOAP返回的XML转换为DataSet或DataTable
将SOAP返回的XML转换为DataSet/DataTable
调用SOAP服务后,我得到了XML格式的ServiceResult变量,希望将其转换为DataSet或DataTable。现有代码如下:
... using (WebResponse Serviceres = request.GetResponse()) { using (StreamReader rd = new StreamReader(Serviceres.GetResponseStream())) { //reading stream var ServiceResult = rd.ReadToEnd(); ... } }
返回的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> <EVN_GET_LOCATION_3200EVN_KTSX_KDResponse xmlns="http://tempuri.org/"> <EVN_GET_LOCATION_3200EVN_KTSX_KDResult> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Table1"><xs:complexType><xs:sequence><xs:element name="UNIT_CODE" type="xs:string" minOccurs="0" /> <xs:element ....
解决方法
返回的XML是SOAP信封格式,DataSet的结构和数据嵌套在SOAP Body的结果节点中,需要先提取这部分内容再加载到DataSet:
解析SOAP XML,提取DataSet节点内容
使用XDocument(或XmlDocument)定位到SOAP信封中包含DataSet的结果节点,提取其内部XML。加载XML到DataSet
将提取出的XML用StringReader读取,通过DataSet.ReadXml方法加载。获取目标DataTable
从加载后的DataSet中取出对应的DataTable(示例中为Table1)。
完整代码示例
using System.Xml.Linq; using System.Data; using System.IO; // ... 原有代码 using (WebResponse Serviceres = request.GetResponse()) using (StreamReader rd = new StreamReader(Serviceres.GetResponseStream())) { var serviceResult = rd.ReadToEnd(); // 解析SOAP XML,定位到DataSet所在节点 XDocument soapDoc = XDocument.Parse(serviceResult); // 定义XML命名空间,需和返回的SOAP XML一致 XNamespace soapNs = "http://schemas.xmlsoap.org/soap/envelope/"; XNamespace tempUriNs = "http://tempuri.org/"; // 提取包含DataSet的结果节点内容 var dataSetXmlContent = soapDoc .Element(soapNs + "Envelope") .Element(soapNs + "Body") .Element(tempUriNs + "EVN_GET_LOCATION_3200EVN_KTSX_KDResponse") .Element(tempUriNs + "EVN_GET_LOCATION_3200EVN_KTSX_KDResult") .ToString(); // 加载XML到DataSet DataSet resultDataSet = new DataSet(); using (StringReader xmlReader = new StringReader(dataSetXmlContent)) { resultDataSet.ReadXml(xmlReader); } // 获取目标DataTable(根据实际表名调整,示例中为Table1) DataTable resultTable = resultDataSet.Tables["Table1"]; // 后续可直接使用resultDataSet或resultTable }
注意事项
- 确保XML命名空间与返回的SOAP响应完全一致,否则无法正确定位节点
- 如果DataSet包含多个DataTable,需根据实际表名获取对应的表
- 若偏好使用
XmlDocument,可替换XDocument的解析逻辑,核心思路都是提取DataSet相关的XML片段
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

