繁体   English   中英

将复杂xml反序列化为对象C#

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM