反序列化 SOAP XML 响应

本文关键字:响应 XML SOAP 反序列化 | 更新日期: 2023-09-27 18:35:24

我很难找到一种从 Web 服务反序列化 XML 响应的方法。响应采用以下格式:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<providerDemographicsResponse xmlns="http://provapi.sys.test.com/provider/network/messages/providerDemographicsResponse/v1" xmlns:ns2="http://provapi.sys.test.com/provider/network/messages/providerAddress/v1" xmlns:ns3="http://provapi.sys.test.com/provider/network/messages/expandedProvider/v1" xmlns:ns4="http://provapi.sys.test.com/provider/network/messages/enrollmentDetails/v1" xmlns:ns5="http://provapi.sys.test.com/provider/network/messages/providerBusinessEntity/v1" xmlns:ns6="http://provapi.sys.test.com/provider/network/messages/providerNpoAssociation/v1" xmlns:ns7="http://provapi.sys.test.com/provider/network/messages/serviceAreaDetail/v1" xmlns:ns8="http://provapi.sys.test.com/provider/network/messages/networkProviderAddress/v1" xmlns:ns9="http://provapi.sys.test.com/provider/network/messages/delegationEntity/v1" xmlns:ns10="http://provapi.sys.test.com/provider/network/messages/providerSpecialty/v1" xmlns:ns11="http://provapi.sys.test.com/provider/network/messages/providerNpi/v1" xmlns:ns12="http://provapi.sys.test.com/provider/common/messages/metadata/v1">
  <ns12:metadata>
    <ns12:serviceReferenceId>test17-02-2016 16:05:47.000616</ns12:serviceReferenceId>
    <ns12:limit>1</ns12:limit>
    <ns12:offset>0</ns12:offset>
    <ns12:total>1</ns12:total>
    <ns12:outcome>
      <ns12:status>200</ns12:status>
      <ns12:message>Successful.</ns12:message>
      <ns12:code>200</ns12:code>
      <ns12:additionalDetails/>
    </ns12:outcome>
  </ns12:metadata>
  <data>
    <providerDemographics>
      <cpfProviderId>0000010</cpfProviderId>
      <effectiveDate>1980-01-01</effectiveDate>
      <terminationDate>9999-12-31</terminationDate>
      <provider-under-review-indicator>N</provider-under-review-indicator>
      <providerTypeDescription>Healthcare Organization</providerTypeDescription>
    </providerDemographics>
    <providerDemographics>
      <cpfProviderId>0000010</cpfProviderId>
      <effectiveDate>1980-01-01</effectiveDate>
      <terminationDate>9999-12-31</terminationDate>
      <provider-under-review-indicator>N</provider-under-review-indicator>
      <providerTypeDescription>Healthcare Organization</providerTypeDescription>
    </providerDemographics>
  </data>
</providerDemographicsResponse>

我有这个类可以在XML底部的提供者人口统计列表中获取:

public class ProviderDemographics {
    [XmlAttribute(AttributeName = "cpfProviderId")]
    public int CpfProviderId { get; set; }
    [XmlAttribute(AttributeName = "effectiveDate")]
    public DateTime EffectiveDate { get; set; }
    [XmlAttribute(AttributeName = "terminationDate")]
    public DateTime TerminationDate { get; set; }
    [XmlAttribute(AttributeName = "provider-under-review-indicator")]
    public string ProviderUnderReviewIndicator { get; set; }
    [XmlAttribute(AttributeName = "providerTypeDescription")]
    public string ProviderTypeDescription { get; set; }
}

我尝试使用常规 XmlSerializer 对其进行反序列化,但我得到了一个例外(我认为与命名空间的数量有关,但我不完全确定)。我也尝试使用 Linq,但是当我尝试使用 XDocument 时,我得到一个空列表。

XDocument doc = XDocument.Parse(xml);
var list = (from d in doc.Descendants("providerDemographics")
            select new ProviderDemographics {
                CpfProviderId = (int)d.Attribute("cpfProviderId")
            }).ToList();

知道我如何从响应中提取提供者人口统计数据作为列表吗?

反序列化 SOAP XML 响应

搜索

元素时需要添加命名空间。因为你想要的元素没有任何特定的命名空间,所以你应该采用父元素命名空间。在这种情况下,它是 providerDemographicsResponse命名空间

这是工作示例:

        static void Main(string[] args)
        {
            string xml = "your provided Xml"
            XDocument doc = XDocument.Parse(xml);
            XNamespace metadataNameSpace = "http://provapi.sys.test.com/provider/common/messages/metadata/v1";
            XNamespace headNameSpace = "http://provapi.sys.test.com/provider/network/messages/providerDemographicsResponse/v1";
            //if you want tags providerDemographics
            var list = (from d in doc.Descendants(headNameSpace + "providerDemographics")
                        select new
                        {
                            CpfProviderId  = d.Element(headNameSpace + "cpfProviderId").Value
                        }).ToList();
            //if you want metadata tags data   
            var metaDatalist = (from d in doc.Descendants(metadataNameSpace + "metadata")
                                select d).ToList();
            Console.ReadKey();
        }