[英]Deserialize Complex xml to Object C#
我试图反序列化以下XML响应从Web服务到C#对象。 但是元素以某种方式返回null。 我在网上看了很多例子,但不确定在哪里弄错了。
<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns4:postTransactionResponse xmlns:ns3=\"http://www.domain/cash/api\" xmlns:ns4=\"http://www.domain/cash/api/soap\">
<ns3:return>
<field1>200</field1>
<field2>FIRSTNAME SURNAME</field2>
<field5>SUBSCRIBER</field5>
<field6>FIRSTNAME SURNAME</field6>
<field7>Active</field7>
<field8>USD</field8>
</ns3:return>
</ns4:postTransactionResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我正在使用以下课程
[XmlRoot("Envelope", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
public class Envelope
{
[DataMember(Name = "Header", Order = 0)]
public object Header;
[DataMember(Name = "Body", Order = 1)]
public EnvelopeBody Body;
}
[XmlRoot("Body", Namespace = "http://www.domain/cash/api/soap")]
public class EnvelopeBody
{
[DataMember(Name = "postTransactionResponse", Order = 0)]
public PostTransactionResponse postTransactionResponse;
}
[XmlRoot("postTransactionResponse", Namespace = "http://www.domain/cash/api/soap")]
public class PostTransactionResponse
{
[DataMember(Name = "return", Order = 0)]
public ResponseModel return_;
}
[XmlRoot("return", Namespace = "http://www.domain/cash/api")]
public class ResponseModel
{
[XmlElement("field1")]
public string field1;
[XmlElement("field2")]
public string field2;
[XmlElement("field3")]
public string field3 ;
[XmlElement("field4")]
public string field4 ;
[XmlElement("field5")]
public string field5 ;
[XmlElement("field6")]
public string field6 ;
[XmlElement("field7")]
public string field7 ;
[XmlElement("field8")]
public string field8 ;
[XmlElement("field9")]
public string field9 ;
[XmlElement("field10")]
public string field10 ;
[XmlElement("field11")]
public string field11 ;
[XmlElement("field12")]
public string field12 ;
[XmlElement("field13")]
public string field13 ;
[XmlElement("field14")]
public string field14 ;
[XmlElement("field15")]
public string field15 ;
}
这是我用来反序列化XML响应的代码。 我正在使用Stream Reader和Envelope类来获取字段。
//Getting response from request
using (WebResponse Serviceres = request.GetResponse())
{
using (StreamReader rd = new StreamReader(Serviceres.GetResponseStream()))
{
XmlSerializer sr = new XmlSerializer(typeof(Envelope));
var obj = (Envelope)sr.Deserialize(rd);
var dat = obj.Body;
var un = dat.postTransactionResponse;
var u = un.return_; //This is giving null
var p = u.field2; //This is giving null
}
}
ResponseModel提供所有空值。
根据您提供的xml,我(通过使用xsd.exe)生成了xsd文件(创建了3个文件:
e:\>xsd env.xml /c /out:temp\
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.6.1586.0]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'temp\env.xsd'.
之后,我基于xsd创建了以下类:
E:\temp>xsd.exe /c /namespace:SampleNs /language:CS env.xsd env_app1.xsd env_app2.xsd
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.6.1586.0]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'E:\temp\env_env_app1_env_app2.cs'.
将结果文件添加到项目中,一切都在运行...有关信息,您的定义有问题-您可以将生成的类与您的类进行比较(例如,您的主体应该是数组或列表)。
对于外部xml /更复杂的xml,我建议始终使用xsd.exe(使您的生活更加轻松)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.