C# XML反序列化C的问题#

C# XML反序列化C的问题#,c#,xml,xml-deserialization,C#,Xml,Xml Deserialization,我在XML反序列化方面遇到了问题 简而言之—— 我有两门课: 短信 SMSSendingResponse 我调用了一个API,它接受一系列参数(由SMSMessage类表示) 它返回一个XML响应。 响应如下所示: <?xml version="1.0" encoding="utf-8"?> <data> <status>1</status> <message>OK</message> <results

我在XML反序列化方面遇到了问题

简而言之—— 我有两门课:

  • 短信
  • SMSSendingResponse
我调用了一个API,它接受一系列参数(由SMSMessage类表示)

它返回一个XML响应。 响应如下所示:

<?xml version="1.0" encoding="utf-8"?>
<data>
  <status>1</status>
  <message>OK</message>
  <results>
    <result>
      <account>12345</account>
      <to>012345678</to>
      <from>054321</from>
      <message>Testing</message>
      <flash></flash>
      <replace></replace>
      <report></report>
      <concat></concat>
      <id>f8d3eea1cbf6771a4bb02af3fb15253e</id>
    </result>
  </results>
</data>
这里是短信发送回复:

using System.Xml.Serialization;

namespace XMLSerializationHelp
{
    [XmlRoot("data")]
    public class SMSSendingResponse
    {
        //should come from the results/result/account element. in our example "12345"
        public string AccountNumber
        {
            get
            {
                return SMSMessage.Result.AccountNumber;
            }
        }

        //should come from the "status" xml element
        [XmlElement("status")]
        public string Status { get; set; }

        //should come from the "message" xml element (in our example - "OK")
        [XmlElement("message")]
        public string Message { get; set; }

        //should come from the "id" xml element (in our example - "f8d3eea1cbf6771a4bb02af3fb15253e")
        public string ResponseID
        {
            get
            {
                return SMSMessage.Result.ResponseID;
            }
        }

        //should be created from the results/result element - ignore flash, replace, report and concat elements for now.
        [XmlElement("results")]
        public SMSMessage SMSMessage { get; set; }
    }
}
这是另一个类(结果)——我想去掉它,所以只剩下前面提到的两个类

using System.Xml.Serialization;

namespace XMLSerializationHelp
{
    [XmlRoot("result")]
    public class Result
    {
        [XmlElement("account")]
        public string AccountNumber{ get; set; }

        [XmlElement("to")]
        public string To { get; set; }

        [XmlElement("from")]
        public string From { get; set; }

        [XmlElement("message")]
        public string Message { get; set; }

        [XmlElement("id")]
        public string ResponseID { get; set; }
    }
}

我不想让SMSMessage知道SMSSendingResponse-因为这将由我的应用程序的不同部分处理

我希望这会有所帮助。XML结构意味着
元素可以多次出现,因此请查看这是否有助于实现所需:

using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.Xml;

namespace XMLSerializationHelp
{
    class Program
    {
        static void Main(string[] args)
        {
            string strXML = @"<?xml version=""1.0"" encoding=""utf-8""?>
<data>
  <status>1</status>
  <message>OK</message>
  <results>
    <result>
      <account>12345</account>
      <to>012345678</to>
      <from>054321</from>
      <message>Testing</message>
      <flash></flash>
      <replace></replace>
      <report></report>
      <concat></concat>
      <id>f8d3eea1cbf6771a4bb02af3fb15253e</id>
    </result>
  </results>
</data>";

            XmlSerializer serializer = new XmlSerializer(typeof(SMSSendingResponse));
            SMSSendingResponse obj = (SMSSendingResponse)serializer.Deserialize(new XmlTextReader(strXML, XmlNodeType.Document, null));

            Console.WriteLine("Status:         {0}", obj.Status);
            Console.WriteLine("Message:        {0}", obj.Message);
            Console.WriteLine("Account Number: {0}", obj.AccountNumber);
            Console.WriteLine("ResponseID:     {0}", obj.ResponseID);
            Console.WriteLine("To:             {0}", obj.To);
            Console.WriteLine("From:           {0}", obj.From);
            Console.WriteLine("ResultMessage:  {0}", obj.ResultMessage);

            Console.ReadLine();
        }
    }

    [Serializable]
    [XmlRoot("data")]
    public class SMSSendingResponse
    {
        public SMSSendingResponse() {}

        //should come from the "status" xml element
        [XmlElement("status")]
        public string Status { get; set; }

        //should come from the "message" xml element (in our example - "OK")
        [XmlElement("message")]
        public string Message { get; set; }

        //should come from the results/result/account element. in our example "12345"
        [XmlIgnore()]
        public string AccountNumber
        {
            get
            {
                Result r = FirstResult;
                return (r != null) ? r.AccountNumber : null;
            }
        }

        //should come from the "id" xml element (in our example - "f8d3eea1cbf6771a4bb02af3fb15253e")
        [XmlIgnore()]
        public string ResponseID
        {
            get
            {
                Result r = FirstResult;
                return (r != null) ? r.ResponseID : null; 
            }
        }

        [XmlIgnore()]
        public string To
        {
            get
            {
                Result r = FirstResult;
                return (r != null) ? r.To : null;
            }
        }

        [XmlIgnore()]
        public string From
        {
            get
            {
                Result r = FirstResult;
                return (r != null) ? r.From : null;
            }
        }

        [XmlIgnore()]
        public string ResultMessage
        {
            get
            {
                Result r = FirstResult;
                return (r != null) ? r.Message : null;
            }
        }

        [XmlArray("results"), XmlArrayItem("result", typeof(Result))]
        public List<Result> Results
        {
            get { return (_Results); }
            set { _Results = value; }
        } private List<Result> _Results = new List<Result>();

        [XmlIgnore()]
        public Result FirstResult
        {
            get
            {
                return (_Results != null && _Results.Count > 0) ? _Results[0] : null;
            }
        }

    }

    [XmlType(TypeName = "result"), Serializable]
    public class Result
    {
        public Result() {}

        [XmlElement("account")]
        public string AccountNumber { get; set; }

        [XmlElement("to")]
        public string To { get; set; }

        [XmlElement("from")]
        public string From { get; set; }

        [XmlElement("message")]
        public string Message { get; set; }

        [XmlElement("id")]
        public string ResponseID { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Xml.Serialization;
使用System.Xml;
命名空间XMLSerializationHelp
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串strXML=@”
1.
好啊
12345
012345678
054321
测试
f8d3eea1cbf6771a4bb02af3fb15253e
";
XmlSerializer serializer=新的XmlSerializer(typeof(SMSSendingResponse));
SMSSendingResponse obj=(SMSSendingResponse)序列化程序。反序列化(新的XmlTextReader(strXML,XmlNodeType.Document,null));
WriteLine(“状态:{0}”,对象状态);
WriteLine(“消息:{0}”,obj.Message);
Console.WriteLine(“账号:{0}”,obj.AccountNumber);
WriteLine(“ResponseID:{0}”,obj.ResponseID);
WriteLine(“To:{0}”,obj.To);
WriteLine(“From:{0}”,obj.From);
WriteLine(“ResultMessage:{0}”,obj.ResultMessage);
Console.ReadLine();
}
}
[可序列化]
[XmlRoot(“数据”)]
公共类SMSSendingResponse
{
公共SMSSendingResponse(){}
//应该来自“status”xml元素
[XmlElement(“状态”)]
公共字符串状态{get;set;}
//应该来自“message”xml元素(在我们的示例中为“OK”)
[XmlElement(“消息”)]
公共字符串消息{get;set;}
//应该来自results/result/account元素
[XmlIgnore()]
公共字符串帐号
{
得到
{
结果r=第一个结果;
返回(r!=null)?r.帐号:null;
}
}
//应该来自“id”xml元素(在我们的示例中为“f8d3eea1cbf6771a4bb02af3fb15253e”)
[XmlIgnore()]
公共字符串响应ID
{
得到
{
结果r=第一个结果;
返回(r!=null)?r.ResponseID:null;
}
}
[XmlIgnore()]
公共字符串到
{
得到
{
结果r=第一个结果;
返回(r!=null)?r.To:null;
}
}
[XmlIgnore()]
来自的公共字符串
{
得到
{
结果r=第一个结果;
返回值(r!=null)?r.From:null;
}
}
[XmlIgnore()]
公共字符串结果消息
{
得到
{
结果r=第一个结果;
返回(r!=null)?r.消息:null;
}
}
[XmlArray(“结果”)、XmlArrayItem(“结果”)、typeof(结果))]
公开名单结果
{
获取{return(_Results);}
设置{u Results=value;}
}私有列表_Results=新列表();
[XmlIgnore()]
公开结果第一结果
{
得到
{
返回(_Results!=null&&u Results.Count>0)?\u Results[0]:null;
}
}
}
[XmlType(TypeName=“result”),可序列化]
公开课成绩
{
公共结果(){}
[XmlElement(“账户”)]
公共字符串AccountNumber{get;set;}
[XmlElement(“to”)]
{get;set;}的公共字符串
[XmlElement(“from”)]
来自{get;set;}的公共字符串
[XmlElement(“消息”)]
公共字符串消息{get;set;}
[XmlElement(“id”)]
公共字符串ResponseID{get;set;}
}
}

我希望这能有所帮助。XML结构意味着
元素可以多次出现,因此请查看这是否有助于实现所需:

using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.Xml;

namespace XMLSerializationHelp
{
    class Program
    {
        static void Main(string[] args)
        {
            string strXML = @"<?xml version=""1.0"" encoding=""utf-8""?>
<data>
  <status>1</status>
  <message>OK</message>
  <results>
    <result>
      <account>12345</account>
      <to>012345678</to>
      <from>054321</from>
      <message>Testing</message>
      <flash></flash>
      <replace></replace>
      <report></report>
      <concat></concat>
      <id>f8d3eea1cbf6771a4bb02af3fb15253e</id>
    </result>
  </results>
</data>";

            XmlSerializer serializer = new XmlSerializer(typeof(SMSSendingResponse));
            SMSSendingResponse obj = (SMSSendingResponse)serializer.Deserialize(new XmlTextReader(strXML, XmlNodeType.Document, null));

            Console.WriteLine("Status:         {0}", obj.Status);
            Console.WriteLine("Message:        {0}", obj.Message);
            Console.WriteLine("Account Number: {0}", obj.AccountNumber);
            Console.WriteLine("ResponseID:     {0}", obj.ResponseID);
            Console.WriteLine("To:             {0}", obj.To);
            Console.WriteLine("From:           {0}", obj.From);
            Console.WriteLine("ResultMessage:  {0}", obj.ResultMessage);

            Console.ReadLine();
        }
    }

    [Serializable]
    [XmlRoot("data")]
    public class SMSSendingResponse
    {
        public SMSSendingResponse() {}

        //should come from the "status" xml element
        [XmlElement("status")]
        public string Status { get; set; }

        //should come from the "message" xml element (in our example - "OK")
        [XmlElement("message")]
        public string Message { get; set; }

        //should come from the results/result/account element. in our example "12345"
        [XmlIgnore()]
        public string AccountNumber
        {
            get
            {
                Result r = FirstResult;
                return (r != null) ? r.AccountNumber : null;
            }
        }

        //should come from the "id" xml element (in our example - "f8d3eea1cbf6771a4bb02af3fb15253e")
        [XmlIgnore()]
        public string ResponseID
        {
            get
            {
                Result r = FirstResult;
                return (r != null) ? r.ResponseID : null; 
            }
        }

        [XmlIgnore()]
        public string To
        {
            get
            {
                Result r = FirstResult;
                return (r != null) ? r.To : null;
            }
        }

        [XmlIgnore()]
        public string From
        {
            get
            {
                Result r = FirstResult;
                return (r != null) ? r.From : null;
            }
        }

        [XmlIgnore()]
        public string ResultMessage
        {
            get
            {
                Result r = FirstResult;
                return (r != null) ? r.Message : null;
            }
        }

        [XmlArray("results"), XmlArrayItem("result", typeof(Result))]
        public List<Result> Results
        {
            get { return (_Results); }
            set { _Results = value; }
        } private List<Result> _Results = new List<Result>();

        [XmlIgnore()]
        public Result FirstResult
        {
            get
            {
                return (_Results != null && _Results.Count > 0) ? _Results[0] : null;
            }
        }

    }

    [XmlType(TypeName = "result"), Serializable]
    public class Result
    {
        public Result() {}

        [XmlElement("account")]
        public string AccountNumber { get; set; }

        [XmlElement("to")]
        public string To { get; set; }

        [XmlElement("from")]
        public string From { get; set; }

        [XmlElement("message")]
        public string Message { get; set; }

        [XmlElement("id")]
        public string ResponseID { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Xml.Serialization;
使用System.Xml;
命名空间XMLSerializationHelp
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串strXML=@”
1.
好啊
12345
012345678
054321
测试
f8d3eea1cbf6771a4bb02af3fb15253e
";
XmlSerializer serializer=新的XmlSerializer(typeof(SMSSendingResponse));
SMSSendingResponse obj=(SMSSendingResponse)序列化程序。反序列化(新的XmlTextReader(strXML,XmlNodeType.Document,null));
WriteLine(“状态:{0}”,对象状态);
WriteLine(“消息:{0}”,obj.Message);
Console.WriteLine(“账号:{0}”,obj.AccountNumber);
WriteLine(“ResponseID:{0}”,obj.ResponseID);
WriteLine(“To:{0}”,obj.To);
WriteLine(“From:{0}”,obj.From);
WriteLine(“ResultMessage:{0}”,obj.ResultMessage);
Console.ReadLine();
}
}
[可序列化]
[XmlRoot(“数据”)]
公共类SMSSendingResponse
{
公共SMSSendingResponse(){}
//应该来自“status”xml元素