2016-02-18 6 views
3

У меня возникли проблемы с определением способа десериализации ответа XML от веб-службы. Ответ приходит в следующем формате:Deserialize SOAP XML Response

<?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> 

У меня есть этот класс, чтобы получить в списке providerDemographics в нижней части 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(); 

Любая идея о том, как я могу извлечь данные о поставщике в виде списка из ответа?

+0

Проверьте свой ответ и скажите мне, если вам помог. – mybirthname

ответ

1

Вам нужно добавить пространство имен при поиске элементов. Поскольку ваш искомый элемент не имеет какого-либо определенного пространства имен, вы должны взять пространство имен родительских элементов. В этом случае имен из 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(); 

     } 
+1

Хорошо, что сработало отлично! Спасибо огромное! –

+0

Добро пожаловать в ваш проект. – mybirthname