我无法找到从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底部的providerDemographics列表:
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();
我知道如何从响应中提取providerDemographics作为列表吗?
答案 0 :(得分:2)
您在搜索元素时需要添加命名空间。因为您想要的元素没有任何特定的命名空间,所以您应该使用父元素命名空间。在这种情况下,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();
}