You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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:

  1. 解析SOAP XML,提取DataSet节点内容
    使用XDocument(或XmlDocument)定位到SOAP信封中包含DataSet的结果节点,提取其内部XML。

  2. 加载XML到DataSet
    将提取出的XML用StringReader读取,通过DataSet.ReadXml方法加载。

  3. 获取目标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:30:31